티스토리 뷰

이 문제는 간단한 bof로 값을 변경하는 문제이다. nc local 서비스 실행과 소켓 통신 오버플로우를 정리하기 위해 라이트 업을 쓴다.


먼저 이 바이너리는 소켓프로그래밍이 되어 있기때문에.


while true; do nc -l -p 1234 -e filename; done


출처: http://s0ngsari.tistory.com/entry/ncnetcat-서버-만들기 [s0ngsari]


를 통해 nc서버를 열어줘야 한다.


실제 CTF에서는 열려있기 때문에 상관이 없다. 나는 따로 푸느라 nc서버를 다시 연 것이다.


최근에는 -e옵션이 없어서 따로 설정을 해줘야 한다.



이렇게 서버를 연 후


nc localhost 31337로 연결을 하면,



다른 오류없이 잘 실행이 된다.


이 문제에는 코드가 제공된다.


그냥 ida로 보겠다.



이 부분이 핵심이다.


참고로 헥스레이를 애용하니깐 gdb를 너무 안쓰는것 같아서 이번에는 제공되는 코드와  gdb로 풀었었다.


Welcome to CSAW CTF. 출력 후 recv로 0x3FC만큼 입력을 받는다.


1020 byte만큼 입력을 받는다. buffer의 크기는 1016이므로 BOF가 발생한다.


문제는 if(backdoor)이 부분이다. backdoor가 참이면 ./key라는 파일을 출력해준다.


gdb 로 분석해보겠다.




스택 프레임은 총 1040(0x410) 만큼 형성이 되어있다.


buffer[1015] = 0;


이 부분을 보면.



buffer[1015]는 bp-0xd 임을 알 수 있다.


if ( backdoor )


이 부분을 보면,


ebp-0xc가 backdoor 변수의 시작임을 알 수 있다.


따라서 메모리 구조는


buffer[1016] | backdoor(4byte) | . . .|


buffer와 backdoor가 dummy없이 이어진다는 것을 알 수 있다.


따라서 1016만큼 A로 채워주고 1을 넣어주면 backdoor는 참이 되어 ./key파일을 출력해준다.( 참고로 key파일은 미리 만들어놨다.)


exploit.py이다.


1
2
3
4
5
6
7
8
9
from pwn import *
 
= remote("localhost",31337)
s.recv()
payload = "A"*1016
payload += p32(1)
 
s.send(payload)
s.interactive()
cs


실행 결과는



flag{hyomin!!!1hart@!}



'pwnable > CTF write-up' 카테고리의 다른 글

[CSAW2013] exploitation-2 write-up  (0) 2018.05.14
[trustealth]easy write-up  (0) 2018.05.13
[Codegate 2018] betting write-up  (0) 2018.05.12
[Codegate 2017] babypwn write-up  (0) 2018.01.30
[Plaid CTF] ropasaurusrex write-up  (0) 2018.01.29
Comments