Return Gadget
ret로 끝나는 어셈블리 조각
원하는 명령어 + ret으로 이루어진 가젯들이다
가젯(gadgets) : 해당 프로그램이 사용하는 메모리에 이미 있는 기계 명령어
ROP chain
리턴 가젯을 사용하여 복잡한 실행 흐름을 구현하는데, 이를 통해 ret2libc, ret2dl-reslove, GOT overwiret 등 payload를 구성할 수 있다.
원하는 가젯들을 조합하여 원하는 흐름으로 이어지게 하기 때문에, 한번에 실행 흐름을 제어할 수 없을 때 주로 사용한다.
따라서 보통은 ret2libc 등과 조합하여, NX를 bypass 하기 위해 많이 사용된다
* 보통은 pie가 걸려있지 않아야 주소가 code, data segment의 주소가 변경되지 않기에 해당 보호기법이 없어야 사용하기 편함
가젯이 아니라 vtable의 함수 등을 조합해서 ROP chain을 만들어 사용하기도 함
x86 vs x64
각자의 함수 호출 방식이 다르기 때문에 해당 함수 호출 방식에 맞게끔 인자를 전달하여 rop 체인을 구성해야한다.
x86 : 스택에서 인자를 가져옴
x64 : 레지스터에서 인자를 가져옴
따라서 버퍼오버플로우 발생으로 rop chain으로 익스할 때 x64의 경우, 인자를 설정하도록 pop rdi; ret와 같은 가젯으로 레지스터에 알맞은 인자를 설정하는 과정을 한 차례 더 거쳐주어야한다.
system("/bin/sh") 으로 공격
1. 필요한 정보 구하기 - 가젯, bss segment, system함수의 offset
2. 실제 주소 획득 - system()과 "/bin/sh"
3. got overwrite, ret2libc 등을 이용하여 익스
gadget 정보 구하기
ROPgadget
명령어로 gadget의 주소를 구할 수 있다.
ROPgadget --binary 경로
해당 경로에 있는 프로그램의 바이너리파일의 가젯의 주소를 구할 수 있다
bss segment 구하기
* read로 overwrite 하려는 경우 read(0, bss, 8)을 하면 bss에 데이터를 입력받기 때문에 bss 영역에 "/bin/sh"를 넣을 수 있음
readelf -S 경로 | grep bss
해당 명령어로 bss 뿐만 아니라 다양한 segment를 구할 수 있음
Library 함수 주소 (실제 주소 획득)
print 함수이름
해당 명령어로 함수가 저장된 주소를 구할 수 있음
ASLR이 걸려있는 경우, 코드에 있는 함수와 사용하고자 하는 함수의 주소 차이는 항상 일정하기 때문에
print 코드함수 - 사용하려는 함수
로 offset 차이를 구하여 overwrite 할 수 있다.
심볼 획득
심볼 e = ELF('./rop')와 같이 설정해주면 이미 저장되어 있는 코드들의 요소인 plt, got를 알 수 있다.
(pwntools 이용)
e.plt['함수이름']
e.got['함수이름']
해당 정보들을 이용하여 조합하면
연쇄적으로 가젯을 이용하면서 덮어쓸 수 있다
ret2libc를 이용하여 rop chain을 구성한것
https://m-in-zu.tistory.com/82
'Hacking > Pwnable' 카테고리의 다른 글
[Exploit] Return to Library (0) | 2024.09.06 |
---|---|
[Mitigation] ASLR (0) | 2024.08.25 |
[Mitigation] NX (0) | 2024.08.25 |
[Mitigation] Stack Canary (0) | 2024.08.24 |
gdb를 pwntools와 디버깅하기 (0) | 2024.07.26 |