ROP - 콜 스택을 제어 하여 리턴 명령어가 실행되기 이전에 프로그램 안에 존재하는 실행 가능한 메모리 영역에서 명령어들을 추출하여 DEP,ASLR같은 기법들을 우회하여 공격할 수 있습니다!


알아야 하는 기본 지식으로는 plt 와 got를 이용하면 got overwriter 와

RTL Chain을 알아야합니다 . 


RTL Chain을 다시 한번 아주 간단하게 알아보고 가겠습니다



RTL Chain이란 그냥 말 그대로 RET를 연속적으로 호출하여 원하는 함수들을 계속 사용해버리는 느낌입니다!


사진을 보시면 RET1~4까지 화살표들이 귀엽게 있습니다.


그중에서 RET2에서 RET3으로 가는 스택안으로 들어가본건데요 

RET2에 POP POP RET가젯을 넣음으로써 POP POP (Parameter1 , 2)에 원하는 실행 함수를 넣고 RET부분에 RET3으로 가게만듬으로써 RET가 계속 일어나게 합니다 .


간단한 예시와 설명을 보면서 진행해보겠습니다 


(*FTZ - LEVEL11을 사용했습니다)



환경변수를 이용한 GOT Overwrite도 다음에 해봐야겠군요!


먼저 ROP를 간단하게 말씀드리자면 버퍼오버플로우 약점이 잇는 함수의 (해당 소스에서는 strcpy) 인자 값만큼 pop하고 ret 구조를 가진 가젯을 찾은 후 공격하기 위한 가젯들의 주소를 하나하나 구해서 페이로드를 짠 뒤 RTL Chain 을 사용해 시스템함수 같은 것을 실행하여 공격합니다 


본 소스로 예제를 보여드리겠습니다 



먼저 gdb분석을 통해 strcpy@plt = 0x804835c를 구했습니다 .



system = 0x4203f2c0 &system 의 주소도 구했습니다 .


strcpy의 안자가 두개기 때문에 pop pop ret 하는 가젯도 구했습니다 .

0x80484ed



여기서 readelf -s 을 사용해서 bss의 주소를 알아야합니다 .


왜 굳이 bss 영역을 사용해야하냐 ? 

bss영역은 한마디로 주소값이 변하지 않습니다 .


bss의 주소는 0804963c 인것을 확인했습니다 .


이제 대강 필요한 정보들을 수집했으니 가젯들을 모아서 

 /bin/sh를 만들어봅시다 .

어렵게 생각하실 필요 없습니다 .

/   ,  b  ,  i  ,  n  , /  , s  , h  문자가 총 몇개지요 ? 

중복되는 문자 / 를 하나 빼면 6개입니다 .

간단합니다 .6개의 주소를 구하면됩니다 .



objdump -s [대상] | grep [원하는 가젯 단어] --color=auto (--color = auto를 사용한 이유는 원하는 가젯 단어에 색깔을 입혀서 구분이 쉽게 만들기 위함입니다.)


자 그러면 저기서 b를 발견했습니다 그래서 b의 주소가 뭐냐?


맨 왼쪽을 보시면 80480f4 라고 써있습니다 . 저 주소는 / 의 주소임을 짐작할 수 있습니다 .


/ = 80480f4 일단 하나를 구했습니다 . 


자 근데 여기서 b의 주소는 /lib/ld ~ 이러한식으로 구성이 되어있는데 

/ = 80480f4 이고 l = 80480f5 i = 80480f6 입니다 


그렇다면? b = 80480f7 입니다 . i 도 구해버렸네요!  i = 80480f6




n = 8048232 



s = 8048240 



h= 8048380


자 모든  친구들이 구해졌습니다! 


이렇게 퍼즐 조각 맞추듯이 가젯들을 모아서 단어를 만들어 공격하는것이 rop입니다.


자 이제 어떻게 페이로드를 짜느냐 ? C라던가 평소와 같이 16진수로 공격하기엔 어어어엄청 복잡하고 길어지더라고요 


그래서 파이썬으로 작성을 해봤습니다



struct 와 os 를 사용한 이유는


struct.pack('<I',number) 부분의 뜻은 리틀엔디안으로 정리한다는 소리입니다.

os.execv(TARGET,("",payload)) 를 사용한 이유는 

execv함수의 원형은 execv(path , argv[]) 입니다 .

path에 지정한 경로명에 있는 파일을 실행하고 argv를 인자로 전달합니다 .

그래서 os.execv(TARGET,("",payload)) 에서 TARGET은 공격할 위치로 만들어주었고 

뒤에 ("",payload) 를 사용한 이유는 (payload) 이렇게만 사용을 하면 파일명에 payload가 들어가서 에러가 난다 



두개 이상이 필요하다고 하면서 에러가 뜨는거같네요 

근데 TARGET 으로 이미 공격할곳을 넣어줬음으로 " "으로 공백으로 전달을 해주고 

argv[1]은 payload를 전달해줌으로써 공격을 합니다! 



이러한식으로 공격이 성립됩니다! 


아직까지는 ROP를 막을 확실한 방법이 없다고 알고 있습니다 .

열심히 공부하고 응용하면 효과적으로 사용할 수 있을거같네요!


'시스템 기법 정리' 카테고리의 다른 글

Fake EBP  (0) 2016.06.02
PLT , GOT [상세히] ,GOT Overwrite  (0) 2016.06.02
Format String Attack (FSB)  (0) 2016.05.30
ASLR를 해제하는 여러가지 방법  (0) 2016.05.29
plt , got , rtl chain , ASLR  (0) 2016.05.28

+ Recent posts