[HITCON TRAINING] LAB5 → WRITE UP
먼저 해당 바이너리의 보호기법을 확인해본다.
해당 바이너리는 인텔 기반의 32비트 바이너리로 확인되며
보호기법(mitgation)으로는 Partion RELRO 및 NX bit가 적용되어 있는 것으로 확인된다.
바이너리의 소스코드는
다음과 같이 간단한 바이너리이며
buf 배열의 크기가 20바이트로 선언되었지만 read함수를 통해 100바이트 길이의 데이터를 입력받으므로
Buffer Over Flow가 발생하는 취약점이 존재한다.
실제 입력값을 통해 몇바이트 입력시 RET를 변조할 수 있는지 확인해보자.
dummy(28Byte) + SFP(4Byte) + RET(4Byte) 총 36개의 문자열 입력시 RET을 변조할 수 있다.
익스플로잇(Exploit)에 앞서 고려해야하는 조건은
1. NX가 걸려있다.
2. Stack에 쉘코드를 삽입하기에 RET 뒷공간이 있지만 ASLR로 인해서 지속적으로 Stack의 주소가 변경된다.
라는 두가지 문제점이 있어 ROP를 이용하여 익스플로잇하려고 한다.
절차는 BSS영역에 쉘코드를 삽입한 뒤 mprotect함수를 이용하여 BSS영역에 실행 권한을 부여한 뒤 최종적으로 해당 BSS영역의 쉘코드를 실행하여
쉘을 획득하겠다.
이를 다시 절차적으로 정리해보면
① read(0, bss_addr, 26) // read함수를 통한 bss영역에 쉘코드(shellcode) 삽입
② mprotect(bss_addr, 26, 7) // mprotect함수를 통한 bss영역에 실행권한 부여
③ bss // 쉘코드(shellcode)가 담긴 bss 영역 실행
이때 필요한 정보는 read함수의 주소, mprotect 함수의 주소, bss영역의 주소와 PPPR 가젯이다.
read 함수 주소 : 0x806cd50
mprotect 함수 주소 : 0x806d870
bss 영역 주소 : 0x80ec000 (mprotect 함수의 인자이기 때문에 0x1000 단위로 설정)
PPPR 가젯 주소 : 0x806cfc9
이를 기반으로 실제 익스플로잇을 작성하면
정상적으로 쉘을 획득한 것을 확인할 수 있다.
'PWNABLE > HITCON TRAINING' 카테고리의 다른 글
[HITCON TRAINING] LAB7 (1) | 2019.01.13 |
---|---|
[HITCON TRAINING] LAB6 (0) | 2019.01.13 |
[HITCON TRAINING] LAB4 (0) | 2019.01.08 |
[HITCON TRAINING] LAB3 (0) | 2018.08.17 |
[HITCON TRAINING] LAB2 미완료 (0) | 2018.08.17 |