본문 바로가기

시스템/등드등

간단한 정리

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