우선 접속을해주자
ls를 통해 확인해주면 flag와 passcode 그리고 passcode의 c파일이 존재한다.
passcode.c를 먼저 읽고 passcode가 어떻게 동작하는지 살펴보자
main함수가 우선 실행되고 welcome -> login 함수 순으로 함수를 실행한다.
welcome 함수에서는 이름을 100바이트 만큼 입력을받고,
login 함수에서는 passcode를 비교해서 맞다면 /bin/cat flag를 실행시켜준다.
하지만, 실제로 실행해보면 Segmentation fault (core dumped)가 발생된다.
이는 login 함수에서 passcode1의 입력받는 부분 아래에 보면 fflush(stdin)이 있는데
이를 유심히 봐야할 것 같다.
fflush(stdin)의 역할은 stdin 버퍼를 비우게 해주는 역할을 수행하는데
아마 해당 문제에서는 익스를 위해서 끼워놓은 것 같다.
출제자의 의도를 대강 파악했으면 해당 부분을 익스해주기 위한 정보를 모으자.
정보를 모으기 위해 gdb를 통해 passcode를 뜯어주었다.
welcome 함수이다.
해당함수를 잘 살펴보면 -0x70(ebp) 즉 [epb-0x70]에 입력값을 저장한다.
그리고 login 함수를 살펴보면
-0x10(%ebp) 즉 [ebp-0x10]에 passcode1의 입력값을 저장한다.
welcome함수에서 100바이트를 받는데 70-10 = 60 = 96이기에
익스가 가능함을 알 수 있다.
fflush(stdin)의 got주소를 login()의 system() 부분으로 바꾸어주면 원하는 flag를 얻을 수 있을 것 같다.
got 주소는 0x804a004이다.
system 함수의 시작부분은 0x80485e3이다.
pwntools로 익스를 짜보자.
이런식으로 짜주었다.
p로 ssh 경로를 짜주고
path에 경로설정
아래 p로 해당 path를 실행
payload를 위에서 구한대로 96바이트를 채워주고 got주소를 입력
아래 p로 payload를 실행해주었다.
이제 passcode1의 입력부분에는 system함수의 시작부분을 정수로 변환하여 넣어주면 flag가 출력된다.
'CTF 중점 스터디' 카테고리의 다른 글
Wargame.kr_PHP? C?_Write up (0) | 2020.01.26 |
---|---|
N00bCTF You Decode it? Write-up (0) | 2020.01.24 |
pwnable.kr flag write up (0) | 2020.01.14 |
wargame.kr_img recovery_Write up (0) | 2020.01.13 |
Suninatas 17 Write-up (0) | 2020.01.13 |