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();
}
#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의 내용 확인
'Kitri_NCS3기 보안과정 > 시스템 해킹' 카테고리의 다른 글
[Reverse Engineering]PE-PE Header (0) | 2017.05.23 |
---|---|
[Reverse Engineering]PE-DOS Header (0) | 2017.05.21 |
170518 환경변수 변조 (export LD_PRELOAD) (0) | 2017.05.18 |
170516 오버플로우를 이용한 RET 변조 (0) | 2017.05.16 |
170515 시스템 해킹, 디버거(GDB)-오버플로우 이해하기 (0) | 2017.05.15 |