본문 바로가기

Kitri_NCS3기 보안과정/시스템 해킹

170519 힙영역 오버플로우

heap에 할당된 영역을 오버플로우하여 eip를 조작해보자.



struct data{

  a [32]

}


struct data *d


d= malloc(sizeof(struct data)


d->a



<stack>

 <heap>

 

 

 

 

 

a[32] 

*d

→ 

 

 

 

 

 

 

 

 


malloc 은 heap영역에 할당시켜주는 역할을 한다. 



<heapof.c>

#include <stdio.h>
#include <stdlib.h>

struct data {
  char name[64];
};

struct fp {
  int (*fp)();
};

void winner()
{
  system("cat flag");
}

void nowinner()
{
  printf("level has not been passed\n");
}

int main(int argc, char **argv){
  struct data *d;
  struct fp *f;

  d = malloc(sizeof(struct data));
  f = malloc(sizeof(struct fp));
  f->fp = nowinner;

  printf("data is at %p, fp is at %p\n", d, f);

  strcpy(d->name, argv[1]);
  f->fp();
}

nowinner 의 함수가 default로 실행되는데 winner로 eip를 넘겨줘서 system("cat flag")를 실행시키도록 하자

 <stack>

 

<heap> 

 

 <heap>

 

 

 

 

 

 *f

*d 

data[64] 

영역만큼의 dummy 값 

Dummy 

 *d

 

 SFP

*f↗

 

 fp()

winner() 

 ret

 

 

 winner()주소



버퍼가 64개라고 더미값을 64개 넣는것이 아니라 name이 힙에 할당됫을때의 esp의 위치와 fp()가 할당됫을때 eps의 위치를 파악해서 dummy가 들어갈 공간을 파악해야 한다. 


호출되서 할당되는 시점은 fp는 main+35(f->fp) 이다. data[]는 main+73(d->name)



data[] 시작 위치 : 0x804b008

fp() 시작 위치 : 0x804b050


0x804b050-0x804b008 = 72 


더미의 크기는 72만큼 넣으면된다. 


disas winner 로 주소를 확인.

winner () : 0x080484db


flag의 내용 확인