HackCTF/Pwnable
[HackCTF] Pwnable - Offset
Shinya Matsuri
2020. 7. 27. 12:03
pwnable 8번 문제인 Offset 이다.
이런식으로 실행이 되는데, 입력을 받는 다는 것 빼고는 잘 모르겠으니 바이너리를 한 번 보자.
32비트 elf파일, NX-bit가 걸려있으니 shell코드를 못 쓰고, PIE가 걸려있으니 매 타임 실행할 때마다 변수, 함수들의 오프셋 위치가 달라질 것이다. FULL RELRO라 GOT Overwrite도 못한다.
s에 입력을 받고, select_func라는 함수에 s를 넘겨준다.
select_func에서는 v3라는 함수포인터에 two라는 값을 넣어주고, dest에 넘겨받은 우리가 입력해준 값을 받고, 그 값이 one이면 v3를 one으로 바꿔준다.
두 함수는 정말 별거 없다.
함수 포인터에 값을 넣어서 실행하는 방식이니 v3를 뭔가로 덮어야한다고 생각했다.
그래서 함수들을 보니, 함수 중에 print_flag라는 함수가 있다.
flag를 출력해준다.
그말은 즉 v3의 값을 print_flag함수의 주소로 덮어쓴다면 flag가 출력될 것이다.
main에서 s는 gets로 입력을 받으니 BOF가 일어날 것이다.
select_func에서의 dest는 ebp-2Ah, v3는 ebp-Ch에 있으니, 0x2A - 0xC = 0x1E = 30(10) 이 된다.
즉, 우리는 더미값을 30칸 채워주고, print_flag의 주소를 쓰면 될 것이다.
익스코드를 짜보자.
성공적으로 익스플로잇이 된다.