Wargame/HackCTF

[HackCTF] Offset

h4won 2021. 4. 15. 15:30

1. 문제

보호기법 확인

nx bit, pie 걸려있다.

 

 

ida 를 통해 까본 모습이다.

puts() 를 통해 출력을 하고, gets() 를 통해 입력을 받은 뒤 select_func() 함수를 실행한다.

 

 

print_flag 함수 존재

printf_flag 라는 함수가 존재한다. 이를 실행 시키는 것이 최종 목표일 것이다.

 

 

selec_func 함수 모습

strncpy 를 통해 dest에 복사를 하는데, 한 바이트만큼 오버플로우 발생한다.

 

v3 -> 함수 포인터

만약에 v3에 print_flag 함수 주소를 넣으면???

v3 가 실행될 때 대신 print_flag 가 실행될 것이다.

 

 

2. 문제 해결 과정

 

그렇다면 v3, dest 의 위치를 알아보자.

dest : ebp - 42

src : ebp - 12

 

offset : 30 인데, 현재 1바이트만큼 변조가 가능하다.

select_func stack

1바이트 만큼만 변조 가능한데, 어떻게 overwrite 하냐고 할 수 있는데

이 문제에서 지금 pie가 걸려있다.

 

PIE (Position Independent Executable) 란?

 

- executable 의 심볼주소들을 모두 상대주소로 인식한다. 그리고 executable 이 로드되는 memory 가 매번 달라지므로, Base address + Relative offset 이 되어, 같은 심볼도 매번 실행 때마다 다른 주소를 가질 수 있도록 하는 것.

 

따라서 우리는 offset 에 해당하는 1바이트 만큼만 변조하면 되는 것이다.

 

two, print_flag의 offset

-> \xAD 를 \xD8 로 변경해주면 된다.

 

 

 

3. 익스플로잇

따라서 페이로드는 다음과 같을 것이다.

"A"*30 + "\xD8"

 

위의 논리대로 페이로드를 작성해보았다!

 

성공적으로 플래그를 획득하였다!