Return Oriented Programming(ROP) _x86
NX bit와 ASLR 보호기법, 코드 서명과 같은 보호기법을 우회할 수 있는 기술
프로그램의 흐름 변경을 위해 Stack Overflow와 같은 취약점을 이용해 콜 스택 통제
→ 주로 스택 기반연산을 하는 코드 가젯(gadgets) 사용
>> RTL + Gadgets
(64bit: 함수의 인자를 레지스터와 스택에 저장해 전달)
gadgets
해당 프로그램이 사용하는 메모리에 이미 있는 기계 명령어
일반적으로 "ret"(반환명령어)이 끝으로, 기존 프로그램 또는 공유 라이브러리 코드 내의 서브루틴에 존재
x64에서는 호출 규약(System V AMD64 ABI) 때문에 피연산자가 매우 중요
x64의 ROP에서 POP 명령어의 역할
= ESP 레지스터의 값을 증가시켜 함수를 연속으로 호출 / 호출할 함수에 전달될 인자 값을 레지스터에 저장
인자 값은 stack에 저장되어 있음 >> 필요한 gadgets을 찾기 어려움
(ex.) gadgets 사용
- 호출할 함수의 첫 번째 인자 값 저장: "pop rdi; ret"
- 호출할 함수의 두 번째 인자 값 저장: "pop rsi; ret"
- 호출할 함수의 첫 번째, 인자 값 저장: "pop rsi; pop rdx; ret"
여러 개의 함수 연속 실행하는 방법
- gadgets을 이용해 인자 값을 레지스터에 저장한 후에 함수를 호출한다
Exaple
$ gcc -fno-stack-protector -o rop rop.c -ldl
$ sudo chown root:root ./rop
$ sudo chmod 4755 ./rop
RSP(0x7ffc185074d8) (= return address)에 저장된 값: 0x4007d0 (main+46)
RSI(0x7ffc18507490) (= buf 변수의 시작 주소)에 저장된 값: 0x7f58ad437168
72개 이상의 문자를 입력함으로써 Return Address 영역을 덮어 쓸 수 있다.
Exploit Method
1. setresuid 함수를 이용해 권한을 root(0)으로 변경: setresuid(0,0,0)
2. system함수를 이용해 "/bin/sh" 실행: system(binsh)
확인할 정보 목록
- "/bin/sh"문자열이 저장된 영역
- libc offset: printf, system, setresuid
- gadget의 위치
: pop rdi, ret
pop rsi, ret
pop rdx, ret
libc 영역에서 "/bin/sh"문자열이 저장된 영역 찾기
libc = 0x7f58acc42000
"/bin/sh" offset = 0x18cd57
Offset 구하기
printf(libcbase) offset: 0x55800
system offset: 0x45390
setresuid offset: 0xcd570
Gadget 찾기
"pop rdx ; pop rsi ; ret ;" : 0x001150c9
Exploit
'System > System Hacking' 카테고리의 다른 글
SROP x64 (0) | 2020.07.24 |
---|---|
SROP x86 (0) | 2020.07.23 |
SROP (0) | 2020.07.23 |
32bit ROP (0) | 2020.06.14 |
RTL (Return to libc) (0) | 2020.05.24 |