반응형
스택의 반환 주소를 덮는 공격은 스택 카나리, NX, ASLR이 도입되며 점점 어려워졌다.
공격 기법은 셸 코드의 실행에서 라이브러리 함수의 실행으로, 그리고 다수의 리턴 가젯을 연결해서 사용하는 Return Oriented Programming(ROP)로 발전하였다.
NX의 도입으로 셸 코드를 사용할 수 없게 된 것은 공격자에게 큰 제약이 되었다.
그래서 지난 코스 Return to Library에서 살펴본 것과 같이 pop rdi; ret같은 코드 가젯과 라이브러리의 system 함수를 사용하는 공격 기법이 새롭게 등장하였다.
현실적으로, ASLR이 걸린 환경에서 system 함수를 사용하려면 프로세스에서 libc가 매핑된 주소를 찾고, 그 주소로부터 system 함수의 오프셋을 이용하여 함수의 주소를 계산해야 한다.
ROP는 이런 복잡한 제약 사항을 유연하게 해결할 수 있는 수단을 제공한ㄷ.
1. ROP
ROP는 리턴 가젯을 사용하여 복잡한 실행 흐름을 구현하는 기법이다.
공격자는 이를 이용해서 문제 상황에 맞춰 return to library, return to dl-resolve, GOT overwrite 등의 페이로드를 구성할 수 있다.
ROP 페이로드는 리턴 가젯으로 구성되는데, ret 단위로 여러 코드가 연쇄적으로 실행되는 모습에서 ROP chain이라고도 불린다.
// Name: rop.c
// Compile: gcc -o rop rop.c -fno-PIE -no-pie
#include <stdio.h>
#include <unistd.h>
int main() {
char buf[0x30];
setvbuf(stdin, 0, _IONBF, 0);
setvbuf(stdout, 0, _IONBF, 0);
// Leak canary
puts("[1] Leak Canary");
printf("Buf: ");
read(0, buf, 0x100);
printf("Buf: %s\n", buf);
// Do ROP
puts("[2] Input ROP payload");
printf("Buf: ");
read(0, buf, 0x100);
return 0;
}
코드를 보니 버퍼 배열로 카나리를 읽어내면 될 것 같다.
반응형
'보안 > 시스템 해킹' 카테고리의 다른 글
[ 시스템 해킹 ] Background: Library - Static Link vs. Dynamic Link (0) | 2022.08.10 |
---|---|
[ 시스템 해킹 ] Mitigation: NX & ASLR (0) | 2022.08.10 |
[ 시스템 해킹 ] DreamHack WarGame : out_of_bound (0) | 2022.08.04 |
[ 시스템 해킹 ] Memory Corruption : Out of Bounds (0) | 2022.08.04 |
[ 시스템 해킹 ] DreamHack WarGame : oneshot (0) | 2022.08.04 |