둘둘리둘둘리둘둘리둘둘리둘둘리둘
ROP (Return Oriented Programming) 본문
@ROP?
리턴 지향 프로그래밍(Return Oriented Programming)이란 이름에서 알수있듯이 공격자가 Call Stack의 제어권을 얻었을때, 대상 프로그램 내의 원하는 명령어와 RETN으로 이루어진 가젯(Gadget)들을 순차적으로 호출하여 해당 프로그램이 공격자의 의도대로 흘러가게 하는 공격 방식. 원하는 가젯들을 프로그래밍 하듯이 조합 하여 ROP란 이름이 붙은듯하다.
Stack Pivot
Call Stack의 제어권을 얻은 지점의 ESP에서 ROP Chain까지 이어주는 다리
스택을 그렸을때 그림의 노란주소의 명령어가 제어권을 얻는 지점
ESP를 제어 가능한 버퍼까지 내려줘서 RETN후 ROP Chain을 호출가능하도록해준다.
(여건이 된다면 노란주소 바로아래 ROP Chains를 구성하는것이 개인적으로 편함)
ROP Chain
최종적으로 원하는 동작(Shell code 실행을 위한 메모리 속성 변경이나 리눅스의경우 Shell을 띄우기 등등)을 시키기위한 본격적인 프로그래밍의 시작, 아래 페이로드는 원하는 가젯이 모두 있다는 조건하에 임의로 구성한 단편적인 예 이다.
(초록색칸은 실행되는 가젯이 아닌 차후에 사용하려고 셋팅해놓은 값들)
- ROP Chain 구성 예시 - 리눅스(Linux)
printf@GOT를 execve@GOT로 변경후 printf("/bin/sh")실행
낮은주소
POP EDI; RETN; |
execve - printf Offset |
POP ESI; RETN; |
printf@GOT |
ADD [ ESI ], EDI; RETN; |
printf@PLT |
JUNK |
"/bin/sh" address |
높은주소
- ROP Chain 구성 예시 - 윈도우(Windows)
마지막의 PUSHAD; RETN;에 의해 VirtualProtect()가 호출되어 ROP Chain이 끝나는주소에서 +0x200주소까지 실행권한 부여 후 ROP Chain이 끝나는 주소부터 실행
낮은주소
POP EDI; RETN; |
RETN; |
POP ESI; RETN; |
VirtualProtect() IAT |
MOV ESI, [ ESI ]; RETN; |
POP EBP; RETN; |
JMP ESP; |
XOR EBX, EBX; RETN; |
ADD EBX, 0x200; RETN; |
XOR EDX, EDX; RETN; |
ADD EDX, 0x40; RETN; |
POP ECX; RETN; |
Writable address |
POP EAX; RETN; |
0X90909090 |
PUSHAD; RETN; |
높은주소