binee::
[Boston key party 2015] simple Calc write up 본문
boston key party 문제 중에서 가장 쉬웠던 문제로 생각한다.
그래서 가장 많은 사람이 풀었다.
소스코드를 보자마자 취약점을 찾을 수 있었고
해당 취약점을 exploit하는 아이디어 또한 간단했다.
그래서 2시간만에 exlpoit 만들고 인증하려고 했지만
중간에 server에서 time을 걸고 일정 시간이 지나면 세션을 끊어버리는 것을 모르고 있어서
local에서 잘되는데 remote로 안되는 이유를 알 수 없어서 뻘짓을 많이 했다.
그래서 네트워크 문제로 생각하고 sleep도 걸어서 하는 과정에서
서버에서 일정시간 동안만 세션을 유지하고 timeout이 나면 세션을 끊는 것을 알 수 있었다.
분석
해당 binary 파일은 64bit elf 파일이고
NX-bit만 걸려 있는 것으로 보아 RTL이나 ROP를 통해서 문제를 해결 하면 될 것 같다.
또한 statically linked로 되어있어서 ROP 가젯을 찾기 좀더 유용 할 것으로 보인다.
실행 화면을 확인하면 4칙연산 기능을 하는 프로그램인 것을 확인 할 수 있다.
연산 횟수를 저장하고 5번 기능을 통해서 연산의 결과를 저장하는 간단한 프로그램이다.
몇가지 입력에 대한 조건이 걸려 있었다.
Expected number of calculations 의 입력 값은 4 이상, 255 이하이고
연산에 사용하는 X 와 Y의 값은 40이상 만 입력을 받는다.
조건이 맞지 많을 경우 프로그램을 종료한다.
그렇다면 해당 프로그램의 취약점은 어디서 발생하는지 IDA를 확인해보면
memcpy(&v5, v8, 4 * v7) 에서 발생한다.
Expected number of calculations에서 입력 받은 값(v5) * 4 만큼의 사이즈를
v5(ebp-0x40) 의 위치에 저장한다.
스택의 구조를 살펴보면 [buffer 64][sfp 8] [ret 8]의 구조를 가지므로
72(buffer+sfp)만큼 dummy 값으로 덮고 8바이트를 원하는 address주소로 변조하면 Buffer overflow 취약점이 발생한다.
단, NX-bit가 걸려 있으므로, RTL과 ROP를 둘중 하나를 선택해야되는데,
statically linked 로 되어 있어서 RTL를 사용 할 수 있는 상황이 아니다.
Exploit
ROP를 통해서 exploit을 해야되는데, mprotect 함수 또한 사용 할 수 없으므로,
syscall로 exploit 하기로 했다.
gadget은 ROPgadget을 이용하여 ROPchain을 쉽게 구할 수 있었다.
그렇다면 구한 payload를 넣기 위해서는 어떻게 해야할지 봐야하는데,
malloc으로 할당 받은 Heap 영역에
adds, subs, muls, divs 함수의 결과값을 저장한다.
연산 결과를 구해놓은 gadget을 넣어주면 간단히 해결 할 수 있다.
하지만 연산과정에서 X, Y의 값이 40이상이라는 조건이 있으므로,
gadget + 0을 넣을 수 없으므로,
(gadget+100) - 100 이런식으로 본래 가젯의 값의 100을 더하고
subs 함수에서 100을 빼는 방법으로 payload를 저장했다.
'CTF' 카테고리의 다른 글
[sCTF 2016] pwn2 write up (0) | 2016.04.19 |
---|---|
[sCTF 2016] pwn1 write up (0) | 2016.04.19 |
[Codegate 2016] oldschool write up (2) | 2016.04.19 |
[Codegate 2016] manager write up (0) | 2016.04.02 |
[Codegate 2016] watermelon write up (1) | 2016.03.27 |