-
pwnable.kr bofWeekHack/Pwnable 2019. 3. 4. 05:59반응형SMALL
안녕하세요. Luke입니다. 오늘은 pwnable.kr의 bof문제를 가지고 왔습니다.
이런 문제라서 일단 바이너리를 받아서 checksec을 해봤습니다.
그 결과, NX와 Canary 그리고 PIE가 걸려있다는 것을 알았죠. 그래서 아 이거 쉘코드를 이용한 bof는 아니구나 라는 생각이 들었습니다. 그래서 IDA로 바이너리를 분석해봤습니다.
a1이라는 변수가 -889275714면 system함수로 binsh를 실행시키더군요. 그리고 캡처하지는 않았지만 저 a1에 전달되는 처음 인자 값은 -559038737로 deadbeef입니다.
참고로 -889275714는 0xcafebabe입니다.
바이너리를 실행하면...
이렇게 입력하는 칸이 나옵니다. 그리고 거기에 오버플로우를 해서, 인자로 전달되는 a1에 접근할 수 있었으면 좋겠습니다. 그럼 이제 gdb로 정확히 한번 분석해보겠습니다.
그리고 이때 쯤 알았는데 bof문제는 소스가 제공되더군요.
#include <stdio.h> #include <string.h> #include <stdlib.h> void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme); // smash me! if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah..\n"); } } int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; }
해당 소스를 보면, overflowme라는 변수가 32바이트의 크기를 차지하고 있고, 그 32바이트 안에 gets함수로 입력을 받습니다. 그러나 gets함수는 취약점이 있는 함수라 overflow가 잘 발생하죠. 그래서 overflow[32]+spf[4]+[ret[4]+쓰레기값[?]의 위치가 key의 위차값이라 생각했습니다.
그래서 아까 열어본 gdb화면을 자세히 보니 29번째 줄에 overflowme가, 40번째 줄에 key의 위치를 알수 있었죠.
바로 esp-0x2c와 esp+0x8 말이에요.
그래서 overflowme는 esp로부터 0x2c(44)만큼 떨어져있고, key는 esp로부터 0x8(8)만큼 떨어져있다는 것을 알게되었죠. 그래서 44+8의 값인 52만큼의 쓰레기 값을 주고 익스플로잇을 하면 성공할 것 같아 pwntools로 익스플로잇 코드를 작성하였습니다.
결과는...
보시다시피 성공입니다!@
반응형LIST