Level14 풀이.
pw = 'what that nigga want?'
일단 문제 접근을 위해 hint를 본다.
이것도 새로운 것이 나왔으니 한 줄씩 분석.
1번째 줄은 int crap = int형 crap 변수 선언.
2번째 줄은 int check = int형 check 변수 선언.
3번째 줄은 char buf[20] = buf[20] 변수 선언.
4번째 줄은 fgets(buf, 45, stdin) = 문자열을 45바이트까지 buf 배열에 저장.
5번째 줄은 if ~~~~는 setreuid ~~~~ system = check 변수에 0xdeadbeef 값이 들어 있을 경우, 3095은 level15 같다. 대충 보니 check 변수에 0xdeadbeef 값 저장하라는 뜻 같다.
check 변수가 초기화되어 있지 않은 거 같으니, 변수 안에 0xdeadbeef 값에 넣어주면 될 듯.
일단 sub 보면 0x38 (56) 바이트만큼 할당.
위의 코드 보면 int crap = 4바이트, int check = 4바이트 char buf[20] = 20바이트.
다 합치면 28이고 나머지 28은 더미가 된다.
즉 char buf[20] 20, check 4, crap 4, dummy 28, sfp 4, ret 4
흠... 구글링 해봤다. 실제로는 변수 사이사이에 껴 있을 것이다.
main+17 보면 ebp-56 위치 주소를 eax로 옮기는 것을 확인 가능.
eax를 올리고 fgets를 call 하는데 그게 곧, ebp-56에 저장.
buf 배열의 크기는 ebp-56부터 20만큼이니까 ebp-36까지.
main+29에서는 ebp-16에서 문자열을 비교. check 변수에 어떤 값이 있나 보면,
buf 배열과 check 변수 사이에 20만큼의 dummy 존재.
입력한 값이 저장된 부분과 문자열을 비교하는 부분까지 40의 빈 공간이 있는데, 여기에 쓰레기 값을 입력, check 변수에 들어갈 deadbeef 값을 넣으면 pw 나올 것이다.
즉 char buf[20] 20 + dummy 20 + check 20 + crap 4 + dummy 8 + SFP 4 + RET 4.
40의 빈 공간이 있는데, 공간에 쓰레기 값을 입력하고, check 변수에 들어갈 deadbeef 값을 넣어주면 된다.
cf) 이전 문제에서 나오는 개념들이 반복되는 것 같고, 그만큼 중요한 것 같다.