먼저 힌트를 봐봅시다 !
int crap; // int형 crap 변수를 선언합니다
int check ; // int형 check 변수를 선언합니다
char buf[20]; //buf[20]배열을 선언합니다.
fgets(buf, 45, stdin); // 문자열을 45바이트까지 키보드로 입력받은 후에 buf 배열에 저장한다
if (check==0xdeadbeef)
{
setreuid(3095,3095);
system("\bin\sh");
}
]
// check 변수에 0xdeadbeef값이 들어있을 경우
3095(level15) 권한을 가지고 /bin/sh를 실행한다!
check변수에 0xdeadbeef 값만 넣어져있다면 해결 할 수있는 문제일거같다
애초에 버퍼 오버플로우가 가능하도록 더 많은 버퍼가 들어갈 수 있게 코드가 되어있다.
스택구조를 대충 파악해보면
char buf[20] dummy1 crap[] dummy2 check[] dummy3 이런식으로 되어있을거같은데 너무 간단하지않나요 ?
gdb로 열어서 구조를 파악해봅시다
main 3을 보면 0x38 만큼 할당해주네요 [56]
근데 main+39를 보면ebp 에서 16을 뺀 지점에서 0xdeadbeef를 넣는다 라고 되어잇네요 그렇다면
buf+dummy값을 총 40 넣어준후에 0xdeadbeef만 넣어주면되겟네요
/bin/sh가 들어 있으므로 따로 값을 넣어 줄 필요는 없을거같습니다
여기서 인자 전달방식이 level12의 gets와 비슷한 fgets이므로 cat 명령어를 pipe를 이용하여서 전달해 줍시다
level15의 권한이 주어졋네요!
'해커스쿨 ftz' 카테고리의 다른 글
FTZ-LEVEL16 (0) | 2016.04.24 |
---|---|
FTZ-LEVEL15 [gdb로 푸는법] (0) | 2016.04.24 |
FTZ - LEVEL13 (0) | 2016.04.23 |
FTZ - LEVEL12 (0) | 2016.04.22 |
FTZ - LEVEL11 (0) | 2016.04.15 |