[HITCON TRAINING] LAB6 → WRITE UP
먼저 해당 바이너리의 보호기법을 확인해본다.
해당 바이너리는 인텔 기반의 32비트 바이너리이며
보호기법(mitgation)으로 Full RELRO 및 NX Bit가 적용되어 있다.
바이너리의 소스코드가 주어져있어 이를 확인해보자.
소스코드의 Line 12에서 40바이트 크기의 buf 배열 버퍼에 64바이트를 입력받으므로 취약점이 존재할 것으로 예상된다.
실제로 main+90에 breakpoint를 설정하고 ret 명령을 수행하기에 앞서
스택의 상태를 확인해본 결과 RET(Return Address)가 0x41414141로 변조된 것을 확인할 수 있다.
여기서 추가적으로 파악한 정보는 RET 뒤에 변조가능한 공간이 총 16Byte에 불과하다는 것이다.
익스플로잇(Exploit)을 수행하기에 앞서서 조건들에 대해 다시 확인해보자.
1. RET 뒤에 16바이트만 변조가 가능하다.
2. Full RELRO가 적용되어 있다.
3. NX bit가 설정되어 있다.
여기서 1번 조건으로 인해서 일반적인 ROP(Return Oriented Programming)이 불가능하다는 사실이다.
일반적으로 16바이트로 ROP를 한다는 것은 불가능한 상황이기 때문이다.
이래서 필요한 것이 Stack Migration이라고 불리는 기법이다.
간단하게 해당 기법을 설명하면 보다 많은 페이로드를 실행시킬 수 있도록 Stack 공간을 임의적으로 이동하여 ROP를 수행하는 기법이라고 말할 수 있다.
페이로드 실행 상태의 메모리 구조를 확인해보면
Stack Migration 기법에서 핵심 포인트는 leave_ret 가젯을 이용하여 변조시킨 SFP가 이주할 스택의 ESP가 된다는 사실이다.
출처 : http://r00p3r.tistory.com/entry/leave-ret%EC%9D%98-%EC%9D%B4%ED%95%B4
변조된 SFP가 EBP 설정된 상태에서 leave ret을 거치게 되면 해당 EBP가 ESP로 복사되며 이후 변조된 ESP에서 pop ebp를 통해 변조된 스택 최상단의 값을
EBP로 재설정하는 것을 확인할 수 있다.
그 후 다음 스택 메모리에 있는 값이 ret명령을 통해 실행된다.
이러한 방법으로 스택을 동적으로 이동하며 ROP(Return Oriented Programming)을 할 수 있는 것이 핵심이다.
한가지 더 고려할 상황으로는 과연 그렇다면 스택공간을 어느 공간으로 이주하는 것이 적절하는 가에 관한 문제이다.
여러가지 의견들을 종합해본 결과 스택 이주에 적합한 공간은
1. Writeable할 수 있어야 한다.
2. 주소가 고정된 부분이 좋다.
3. 일반적으로 사용하지 않는 공간이어야 한다.
이러한 상황을 고려하여 작성된 페이로드이다. (필자가 작성한 페이로드가 아님)
'PWNABLE > HITCON TRAINING' 카테고리의 다른 글
[HITCON TRAINING] LAB8 (0) | 2019.01.15 |
---|---|
[HITCON TRAINING] LAB7 (1) | 2019.01.13 |
[HITCON TRAINING] LAB5 (0) | 2019.01.09 |
[HITCON TRAINING] LAB4 (0) | 2019.01.08 |
[HITCON TRAINING] LAB3 (0) | 2018.08.17 |