[HackCTF] Offset
1. 문제
nx bit, pie 걸려있다.
puts() 를 통해 출력을 하고, gets() 를 통해 입력을 받은 뒤 select_func() 함수를 실행한다.
printf_flag 라는 함수가 존재한다. 이를 실행 시키는 것이 최종 목표일 것이다.
strncpy 를 통해 dest에 복사를 하는데, 한 바이트만큼 오버플로우 발생한다.
v3 -> 함수 포인터
만약에 v3에 print_flag 함수 주소를 넣으면???
v3 가 실행될 때 대신 print_flag 가 실행될 것이다.
2. 문제 해결 과정
그렇다면 v3, dest 의 위치를 알아보자.
dest : ebp - 42
src : ebp - 12
offset : 30 인데, 현재 1바이트만큼 변조가 가능하다.
1바이트 만큼만 변조 가능한데, 어떻게 overwrite 하냐고 할 수 있는데
이 문제에서 지금 pie가 걸려있다.
PIE (Position Independent Executable) 란?
- executable 의 심볼주소들을 모두 상대주소로 인식한다. 그리고 executable 이 로드되는 memory 가 매번 달라지므로, Base address + Relative offset 이 되어, 같은 심볼도 매번 실행 때마다 다른 주소를 가질 수 있도록 하는 것.
따라서 우리는 offset 에 해당하는 1바이트 만큼만 변조하면 되는 것이다.
-> \xAD 를 \xD8 로 변경해주면 된다.
3. 익스플로잇
따라서 페이로드는 다음과 같을 것이다.
"A"*30 + "\xD8"