감자 텃밭

[HackCTF] - yes or no 본문

my_study/HackCTF

[HackCTF] - yes or no

g2h 2021. 8. 26. 23:53

이번에 풀어볼 문제는 yes or no라는 문제이다 가장 오래 걸렸으며 이게 왜 150점짜리인지 도통 모르겠다..

해당 프로그램을 우선 실행시켜 보았다.

show me your number~! 이라는 문자열이 출력되며 특정 값을 입력받도록 되어있다.

그 후 또 다른 문자열들이 출력되었다. 메모리 보호기법은 NX가 걸려있으며 ALSR 또한 걸려있었다.

해당 프로그램을 IDA를 통해 상세히 분석해보았다.

아래쪽 IF조건문을 통과하면 That's cool follw me문자열을 출력하며 gets로 입력을 받도록 되어있다 해당 부분에서 bof가 일어날 것으로 예상된다. 해당 조건문에 해당하는 값을 gdb로 확인하였다.

헤다 237번째 줄을 보면 cmp를 통해 rbp-0x8과 eax의 값을 비교한다 해당 부분에 bp를 걸고 실행시켜서 eax에 들어있는 값을 확인했다.

0x960000 즉 10진수로 변환시켰을 시 9830400 이나온다 해당 값을 입력하면 조건문을 통과하여 gets로 입력을 받을 수 있다. 그렇다면 gets로 입력받는 부분부터 ret까지의 거리를 구하면 조건문 통과 후 gets로 입력받는 값의 위치는

0x12이니 18 + 8 을 더미 값으로 채우면 ret까지 접근이 가능하다

그럼 이제 예상 시나리오는 rop를 이용하여 우선 system함수와 binsh를 이용하기 위한 pop rdi; ret가젯과 ret가젯이 필요하며, 메인으로 돌아가서 puts_plt를 이용하여 puts_got의 주소를 알아내어 알아낸 puts의 주소로 시스템 함수와 binsh의 주소를 찾고 다시 조건문을 통과해 gets로 system함수를 실행시키면 된다.

페이로드는 아래와 같이 작성하였다.

그 후 해당 코드를 실행시키면 성공적으로 쉘을 획득할 수 있다.

해당문제는 64bit rop를 사용 한문제로 굉장히 힘들었다.. 그래도 많은 것을 알게 된 문제인 거 같다.

'my_study > HackCTF' 카테고리의 다른 글

[HackCTF] - RTC  (1) 2021.11.25
[HackCTF] pwning  (0) 2021.09.26
[HackCTF] ROP  (0) 2021.08.16
[HackCTF] gift  (0) 2021.08.16
[HackCTF] Look at me  (0) 2021.08.16