Defcon 23 Prequals - ropbaby
RELRO STACK CANARY NX PIE RPATH RUNPATH FILE
No RELRO No canary found NX enabled PIE enabled No RPATH No RUNPATH ./ropbaby
PIE 보호기법은 공격시 바이너리 주소를 이용하지 못하도록 파일을 실행 할 때마다 해당 주소를 랜덤하게 바꿔주는 것인데, 이 랜덤하게 바뀌는 것이 ASLR의 랜덤 라이브러리의 주소 할당 방식과 동일하다고 알고 있습니다.(소스코드를 보거나 하지 않아서 확실하지 않음)
그러므로 라이브러리 주소와 바이너리 주소가 랜덤하게 계속 바뀌지만 위와 같은 특성으로 어느 한 지점(라이브러리주소 or 바이너리주소)으로부터 내가 공격에 사용하길 원하는 값이 위치한 오프셋이 동일하다는 것을 알 수 있습니다.
이점을 이용하여 PIE를 우회하고 공격 페이로드에 바이너리 주소를 사용하기 위해서는 라이브러리나 바이너리의 주소 값을 릭하면 되는데, ropbaby라서 그런지 대놓고 libc의 주소값을 줍니다. (아래 사진 참고)
또한, 위 사진에서 3번 메뉴를 보면 최대 1024 바이트의 값을 입력받게 되고, 4번 메뉴를 선택하여 종료하면 bof로 인해 rip가 바로 변조됨을 알 수 있습니다.
따라서, PIE 보호기법을 우회하여 공격 페이로드를 짜기 위해 다음과 같은 정보가 필요한데, 위 메뉴에서 손쉽게 바로 구할 수 있습니다.
1. libc 주소 => 1번 메뉴로 얻음
2. system() 주소 => 2번 메뉴로 얻음
3. "/bin/sh" 주소 => 대회 서버와 동일한 환경에서 libc에 있는 "/bin/sh" 문자열과 2번에서 얻은 system() 주소간 오프셋으로 얻음
4. "pop rdi, ret" 주소 => 1번에서 얻은 libc 주소에서 해당 가젯까지와의 오프셋으로 얻음