먼저 힌트를 봐봅시다 ! 

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

+ Recent posts