-
Syscall 가젯이 없을 때공부정리 2019. 3. 6. 04:06
Pwnable문제를 풀다보면 syscall로 익스를 해야될 때가 있다.
딱 언제라고 예를 들기는 어렵지만, 여러가지 제한들이 걸려있는 상황이 그렇다.
RTL이 불가능할 때? 이 때 제일 많이 사용했던 것 같다.
하지만, Syscall_gadget마저 제한을 둔 문제들이 종종 있다.
이 때, Libc에 있는 syscall가젯의 하위 1Byte를 GOT_Overwrite해서 syscall을 사용할 수 있다.
[ find "\x0f\x05"(syscall) ]
x64의 시스템콜 opcode인 "\x0f\x05"를 검색해보면 Libc에 위치한 syscall가젯들이 대략 573개 정도 나온다.
여기서 내가 syscall가젯으로 Overwrite할 함수에 위치한 syscall을 찾아야 한다.
[ read_syscall ]
빨간박스로 강조해둔 부분이 read( )가 내부적으로 동작할 때, 실행되는 Syscall가젯이다.
저 가젯의 하위1Byte인 "\x5e"를 read.got에 Overwrite하게 되면, read( )는 Syscall가젯으로 동작하게 된다.
이런식으로 syscall가젯이 없을 때, syscall가젯을 만들어줄 수 있다.
32Bit도 똑같이 하면 된다.
ASLR나 PIE같은 미티게이션이 적용되어 있어도
해당 위치에 대한 offset값은 항상 일정하기 때문에 이러한 방법으로 가젯을 만들 수 있다.
RAX(syscall_id)는 syscall_read의 반환값(입력된 Byte)으로 맞춰 주면 된다.
'공부정리' 카테고리의 다른 글
vsyscall을 이용한 Exploit (0) 2019.06.16 gdb로 fork된 자식프로세스 디버깅하기 (2) 2019.04.06 Return-to-Csu 기법 정리 (8) 2019.03.05 메모리 보호기법 - PIE (1) 2019.01.12 [02-14 공부정리(FSB 정리)] (0) 2018.02.15 댓글