Pwnstar

HackCTF 0x7번 Offset 본문

Wargame/HackCTF

HackCTF 0x7번 Offset

포너블처돌이 2020. 1. 24. 03:28

여덟 번째 문제

 

 

우선 32비트이고, Full RELRO여서 GOT overwrite 불가능, NX 때문에 쉘코드 삽입 불가능, PIE 때문에 모든 섹션이 랜덤하게 재배치된다.

 

IDA로 열어보면

 

메인함수는 어떤 함수를 call하겠냐는 질문과 받은 입력을 select_func에 인자로 준다.

 

select_func 함수는 인자로 넘겨받은 입력을 "one" 문자열과 비교하여 같으면 one 함수를 실행시켜 준다.

 

함수 목록에 보면 one 함수, two 함수, print flag 함수 등등이 있는데

one 함수와 two 함수는 별것 없다 그냥 이 함수는 one 함수다 two 함수다 라는 것만 알려준다.

이제

 

이 함수로 어떻게 가느냐가 관건인것 같은데

 

처음 이 문제를 풀 때 너무 어렵게 생각해서 시간을 많이 잡아먹었다.

PIE가 걸려있으면 함수의 base 주소만 계속 바뀌고 offset은 그대로이기 때문에 이 부분만 덮어주면 충분히 풀 수 있는 문제였다.

 

이 문제에서 하나 더 알게 된 점이 있는데, strncpy도 strcpy처럼 취약하다는 점이었다. strncpy는 (1, 2, 3) 이렇게 세 개의 인자를 받는데 2번에서 1번으로 3의 길이만큼 복사하는 함수이다. 그런데 2의 길이가 3보다 길더라도 복사를 진행한다는 점에서 overflow가 발생할 수 있었다. 그러면 eip를 print_flag의 offset으로 덮어준다면 충분히 flag를 볼 수 있을 것이다.

 

select_func 함수에서 복사된 문자열은 ebp-2ah로 42바이트의 크기를 가지고 있고, v3는 ebp-ch로 12바이트의 크기를 가지고 있다.

 

그렇다면 dummy를 30바이트만큼 주고, offset을 print_flag의 offset을 추가해준다면 본래 two로 설정되어있던 v3가 print_flag로 바뀔 것이다.

 

print_flag의 offset은 0x000006D8

 

익스코드는 이렇게 단순하게 짰다.

 

 

그리고 플래그 뙇

 

 

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

HackCTF 0x9번 Yes or no  (0) 2020.01.31
HackCTF 0x8번 BOF_PIE  (0) 2020.01.30
HackCTF 0x6번 Simple_Overflow_ver_2  (0) 2020.01.24
HackCTF 0x5번 x64 Simple_size_BOF  (0) 2020.01.24
HackCTF 0x4번 x64 Buffer Overflow  (0) 2020.01.23
Comments