RTL
return to library 의 약자이고 linux에서는 return to libc라고 불린다.
(linux에서 library가 libc)
DEP/NX를 우회하기 위한 기법
이 기법을 이용하면 프로그램에 system()가 없어도 라이브러리의 system()를 호출하여 사용이 가능하다.
이 기법을 익히기 전에 먼저 알고가야할 것들이 있다.
바로 plt와 got.
plt = procedure linkage table, got = global offset table
plt란?
사용자가 만든 함수는 plt를 참조할 필요가 없지만
외부 라이브러리에서 가져다 쓸 경우 plt를 참조하게 된다.
예를 들어 우리가 바이너리에서 만든 함수들 (main(), func() 등)은 plt를 참조할 필요가 없다.
got란?
실제 함수들의 주소를 담고 있는 테이블이다.
라이브러리에서 함수를 호출할 때 plt가 got를 참조한다.
결론적으로
어떤 외부 라이브러리에서 함수를 사용할 때 plt에서 got로 넘어가고
got에는 실제 라이브러리 함수의 주소가 들어있다.
RTL Chaining
RTL 기법을 응용하여 라이브러리의 함수의 호출을 연계하는 것
RTL 기법에서는 하나의 함수만 호출하였다면,
RTL Chaining에서는 여러 함수를 연계하여 호출하는 것을 말한다.
즉, 이 return address에 pop ret과 같은 명령어의 주소를 넣어 스택 포인터를 다음 함수로 위치시키는 기법이다.
실습 : read() -> system() -> exit()를 연계하여 쉘을 실행시킬 것이다.
필요 : read() 주소, system() 주소, exit() 주소, /bin/sh 문자열이 들어갈 메모리 공간, Gadget
* Gadget : 스택 포인터를 다음 함수의 주소로 이동시켜주는 코드 조각
ex. pop pop ret과 같은 코드들의 모음
1. bof를 일으켜 ret에 read()의 주소를 덮는다.
2. bss영역에 /bin/sh\0(총 8byte)을 넣는다.
* bss 영역 : 변하지 않는 스택
3. system()를 호출하고, 인자로 bss의 주소를 넘겨준다.
4. exit() 호출하고 끝낸다.
실제 함수 주소 확인 : p printf
plt,got 주소 확인 : elfsymbol print
참고
리눅스 메모리 보호기법
1. ASLR : 스택, 힙, 라이브러리 등 주소를 랜덤으로 프로세스 주소 공간에 배치
실행할 때마다 데이터 주소 바뀐다.
2. NX=DEP : 데이터 영역에서 코드 실행되는 것 막는다.
스택의 실행권한 없애는 메모리 보호 기법, 스택에 쉘코드 있어도 실행불가
+ 메모리 페이지의 권한을 write권한과 execute권한을 동시에 갖지 않도록 설정하는 것
ex) 지역변수에 입력받을 때 overflow가 발생하는 바이너리가 있을 경우
if NX 활성화 X -> 지역변수 메모리에 쉘코드 넣고 ret addr을 쉘코드를 가리키게 하여 쉘코드 실행 가능
if NX 활성화 -> 메모리에 execute 권한이 없으므로 쉘코드 실행 불가
3. Stack Canary : 함수 진입 시 스택에 SFP(Saved Frame Pointer)와 return address정보 저장할 때,
이 정보들이 공격자에 의해 덮어씌어지는 것 보호하려고
스택상 변수들의 공간과 SFP 사이에 특정한 값 추가한다.
4. RELRO(Relocation Read-only) : ELF바이너리 또는 프로세스의 데이터 섹션 보호하는 기술
즉, 메모리가 변경되는 것 보호
-> .ctors, .dtors, .jcr, .dynamic, .got 섹션이 읽기전용상태(Read-only)가 됨
Partial Relro가 적용되어 있으면 GOT overwrite 가능
-> ROT(Return Oriented Programming)
컴파일 옵션
1. ASLR 해제 : echo 0 > /proc/sys/kernel/randomize_va_space (OS 옵션)
randomize_va_space=0 : ASLR 해제
randomize_va_space=1 : 랜덤 스택 & 랜덤 라이브러리 설정
randomize_va_space=2 : 랜덤 & 랜덤 라이브러리 & 랜덤 힙 설정
2. NX제거 = 스택에 실행권한주기 : -z execstack
3. Stack Canary 제거 : -fno-stack-protector
4. RELRO 설정
- No RELRO가 기본값일 때 Partial Relro : -z relro
- Partial Relro가 기본값일 때 No RELRO : -z norelro
'시스템 > 등드등' 카테고리의 다른 글
Wannacry 1차 정리본 (0) | 2019.01.26 |
---|---|
pwntools 간단 정리 (0) | 2019.01.11 |
ELF 파일 구조 (3) | 2018.11.20 |
Format String Bug (0) | 2018.11.10 |
ARM Assembly 간단 정리 (0) | 2018.11.05 |