1. 문제
소스 코드를 간단하게 분석해보면 다음과 같다.
1. 입력 시 bof 발생
2. 함수 포인터를 통해 call() -> printit() 실행
3. shell 함수를 직접 실행하는 부분이 없음. 어떻게 shell 함수를 실행시킬 수 있을까?
-> shell 함수를 실행하는 것이 문제의 목표임.
고민해보다가 다음의 아이디어가 떠올랐다.
bof 를 통해 함수 포인터에 printit() 대신 shell() 을 넣어주면
그 뒤에 call이 실행되며 shell()을 실행할 것이다.
2. 문제 해결 과정
필요한 것들을 구해보자!
1. 함수 포인터의 위치
mov DWORD PTR [ebp-16], 0x8048500이
void (*call)() = printit 부분 같아서 printit 함수를 디스어셈블 해보았다.
그 결과 0x8048500이 printit 함수의 시작부분으로, 함수 포인터 *call의 위치는 ebp-16이다.
*call = ebp-16
buf = ebp-56
40만큼 차이남 -> overwrite 가능함.
2. shell()의 시작 주소
따라서 payload는 다음과 같을 것이다.
payload = "A"*40 + 0x80484d0
3. 익스플로잇
'Wargame > Hackerschool FTZ' 카테고리의 다른 글
[FTZ] 해커스쿨 FTZ level 18 (0) | 2021.04.13 |
---|---|
[FTZ] 해커스쿨 FTZ level 17 (0) | 2021.04.13 |
[FTZ] 해커스쿨 FTZ level 15 (0) | 2021.04.12 |
[FTZ] 해커스쿨 FTZ level 14 (0) | 2021.04.12 |
[FTZ] 해커스쿨 FTZ level 13 (0) | 2021.04.12 |