입력을 두 번 받는 것 빼고는 간단한 BOF 문제이다. name이라는 변수가 어디에 저장되어 있는지를 찾고 여기에 NOP + shellcode 를 삽입, RET을 &name으로 바꾸어주면 쉘이 따질 것이다. name 변수는 bss 영역에 존재한다. 전역변수 중에서 초기화된 변수는 data 영역에, 초기화되지 않은 변수는 bss영역에 들어간다고 한다. &name → 0x0804a060 payload를 작성하고 exploit 코드를 짜자. from pwn import * r = remote("ctf.j0n9hyun.xyz", 3003) r.recvuntil(": ") name = "\x90"*20 name += "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\..
이번 문제는 GOT Overwrite를 이용한 Format String Bug 문제이다. ida로 basic_fsb.dms바이너리파일을 분석한 결과를 보자. 디컴파일된 코드를 보면 우선 main 함수에 vuln() 함수가 호출되고 vuln() 함수에서는 s에 입력을 받고 printf 함수를 통하여 출력한다. 기존의 printf 사용과는 달리 FSB 환경(" " 사용 X)이 주어져있기 때문에 다음과 같이 해결할 수 있다. printf 함수의 GOT 주소를 쉘을 실행시키는 함수의 주소로 덮는다. GOT Overwrite 가 되었으면 printf(&format) 코드가 실행될 때 쉘실행 함수가 실행될 것이다. flag라는 멋있는 함수가 들어있다. 이제 이 함수의 주소를 구해보자. → 0x080485b4 FSB..
v5가 함수 포인터로 선언되어 있으므로 v5 자리에 쉘을 실행시키는 함수를 넣으면 될 것 같다. gdb로 분석하여 다른 함수들이 존재하는지 살펴보자. 이번 문제는 gdb와 ida로 분석해보면 함수 목록중에 shell 이라는 함수가 존재한다. 이 부분을 살펴보자. 역시 쉘을 실행시키는 함수가 있다. 이 함수의 주소를 찾아서 v5 자리에 덮어주면 쉘이 실행될 것이다. —————————— High Address | ret(4) | —————————— | sfp(4) | —————————— ← ebp | dummy | —————————— | v5 | —————————— ← ebp - 0xc | dummy | —————————— | s | —————————— Low Address ← ebp -0x8c from p..