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 * p = 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 |