참고 자료
https://www.lazenca.net/display/TEC/02.ROP%28Return+Oriented+Programming%29-x64
02.ROP(Return Oriented Programming)-x64 - TechNote - Lazenca.0x0
Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x64 ROP( Return-oriented programming )는 공격자가 실행 공간 보호(NXbit) 및 코드 서명(Code signing)과 같은 보안 방어가있는 상태
www.lazenca.net
ROP... 쉽지않다. 간단한 bof정도만 풀 수 있는 나였지만 뭐 풀어야 하는데 어쩌겠는가.
Return Oriented Programming(ROP)
NXbit(No eXecute bit)를 지원하는 운영 체제는 특정 주소 공간의 영역을 실행 불가능하게 할 수 있다. 이로써 프로세스는 이 주소 공간의 영역에 있는 코드를 실행하는것을 거부한다. 실행 공간 보호라고도 하며, 악성 소프트웨어가 다른 프로그램의 데이터 저장 영역에 자신의 코드를 삽입하고 이 섹션 내에서 자신의 코드르 실행하는 것을 방지하는데 사용된다.
이러한 Nxbit과 코드 서명(Code signing)과 같은 보안 방어가 있는 상태에서 코드를 실행 할 수 있게 해주는 기술이 바로 ROP 라고 할 수 있다.
또한 이름에서 알 수 있듯이 return을 기반으로 한 프로그래밍이란 뜻이다.
프로그래밍? 왜 프로그래밍이지..? 라고 생각이 드는 사람도 있을거고 당연히 알고있지 라는 분도 계실것이다.
먼저 바이너리에는 수많은 어셈블리 코드들이 존재한다. 이러한 코드들의 조각, 즉 코드 일부분 일부분들을 Gadget이라고 한다. 대표적인 예로 "pop rdi; ret" 과 같은 가젯이 존재한다고 치면, 우리는 이러한 가젯을 모아서 원하는 대로 배치 시켜서 원하는대로 프로그램의 흐름을 바꿀 수 있는 것이다!
그러면 프로그램내에 system("/bin/sh")을 실행시키는 "의도적인" 문제 풀기용 함수가 없어도 되는 것이다. 두둥.
x86의 경우 pop; pop; pop; ret이라는 가젯이 중요했다. 왜? (다음에 알아보도록 하자)
하지만 x64의 경우 pop 명령어의 피연산자가 매우 중요하다. 이 차이는 x86의 호출 규약인 Cdecl(C declaration) 과 x64의 호출 규약인 System V AMD 64 ABI에 차이에 대해 찾아보자(https://www.lazenca.net/display/TEC/01.The+basics+technic+of+Shellcode#id-01.ThebasicstechnicofShellcode-01.ThebasicstechnicofShellcode-Saveargumentvalueinregisters)
우리는 원하는 함수를 실행하기 이전에 pop rdi; ret 과 같은 가젯을 이용하여 rdi에 원하는 값을 저장할 수 있다.
이렇게 레지스터에 필요한 값들을 저장한 이후 system() 함수를 실행하여 system의 인자값으로 사용되는 rdi 레지스터에 "/bin/sh"과 같은 문자열을 넣고 실행시킨다면 두둥! 할것이다.
rop.c
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h>
void vuln(){
char buf[50];
void (*printf_addr)() = dlsym(RTLD_NEXT, "printf");
printf("Printf() address : %p\n",printf_addr);
read(0, buf, 256);
}
void main(){
seteuid(getuid());
write(1,"Hello ROP\n",10);
vuln();
}
해당 코드를 가지고 실습을 할 예정이다. 다음시간에 만나요~
'시스템해킹' 카테고리의 다른 글
[LAZENCA] ROP-x64 part.3 (0) | 2023.11.09 |
---|---|
[LAZENCA] ROP-x64 part.2 (1) | 2023.11.09 |
드림핵 off_by_one_000 writeup (0) | 2023.11.02 |
SSTF bof101 writeup (1) | 2023.11.02 |
[sunshine CTF 2023] Array of Sunshine writeup (1) | 2023.10.19 |