ROP 를 공부하는 사람들이 가장 많이 풀어보는 ropasaurusrex 문제이다.


먼저 ROP가 무엇인지 알아보자.


ROP (Return Oriented Programming)


프로그램 내부에 있는 기계어 코드 섹션(Gadget) 을 이용한 Buffer Overflow 공격 시 특정 명령을 실행시키는 방법을 말한다. 


보통 가젯은 함수끝에 있는 ret 명령어를 포함한 상위 몇가지 명령어들의 집합이며 이를 이용하여 단번에 공격을 성공할 수 있다.


ROP 는  RTL, RTL Chaining, GOT overwrite 3가지의 기술을 사용한다.


(1) RTL

(/bin/sh)을 실행하기 위해 system( ), exec*( )등과 같은 함수를 사용하여 공격


(2) RTL Chaining 

RTL 공격을 연속적으로 일어나게 스택을 구성하여 공격하는 방법.

연속적으로 함수를 호출할 수 있다.


(3) GOT Overwrite

실제 함수 주소를 저장해 놓은 공간인 GOT에 특정한 함수의 GOT로 변경하여 원하는 함수가 실행되게 하는 방법. (PLT.GOT 정리 참고)



ROP에서 가장 중요한 것은 라이브러리 이다. 라이브러리는 바이너리 내에 있는 주소 이므로 가젯으로 사용이 가능하다. 하지만 라이브러리의 주소는 0x00653a0 와 같은 형태로 되어 있기 때문에 그대로 사용해서는 안된다.  


그 이유는 바이너리 내의 라이브러리는 imagebase 라는것이 존재하기 때문이다. 


이것은 라이브러리의 시작주소를 의미한다.


예를들어 imagebase가 0xf755b00이고  system 주소가 0x1234567 이라고 가정하면 0xf755b00 + 0x1234567이  system주소가 된다.


하지만 라이브러리는 보통 ASLR 때문에 이미지베이스가 계속 바뀐다.


imagebase를 구하는 방법은 예를들어


write@libc = 0x12345 

실제 write@libc = imagebase + 0x12345

imagebase = write@got - write@libc (0x12345)


다음과 같이 구할 수 있다^^


문제를 풀기에 앞서 일단 file 명령어를 이용하여 파일의 속성을 살펴보자.



32bit ELF가 strip 되어 있다,


strip은 오브젝트 파일에 있는 심볼을 삭제하는 툴이다.


일반적으로 빌드가 완료된 실행파일 또는 라이브러리에서 불필요한 심볼을 제거하는데 사용되고 있다. 사용하게 되면 디버깅을 할때 함수명이 보이지 않는다.


보호기법이 걸려있는지 확인하기 위해 pwntool 라이브러리를 이용하였다.


설치방법은 pip install pwntools 명령을 이용해 설치할 수 있다.


선행으로 pythonp-pip와 python-dev가 설치되어있어야 하며


이것만 설치할 경우 ROP클래스를 호출할때 disasm 오류가 발생한다.


따라서 apt-get install libcapstone-dev명령을 이용하여

libcapstone-dev를 설치해준다.


python을 이용하여 다음과 같이 입력한다


>>>from pwn import*

>>>elf = ELF("./ropasaurusrex")



NX(No Excutable) 가 활성화 되어있음을 확인하였다.


NX란 메모리 보호기법 중 하나이다.

메모리 페이지의 write권한과 execute 권한을 동시에 갖지 않도록 설정한다.

메모리에 execute 권한이 없으므로 쉘코드를 실행시킬 수 없다.


ROP를 이용하여 NX 를 우회할 수 있으므로 이를 이용하여 문제를 해결한다.


해당 바이너리를 IDA 로 열어보면 다음과 같은 소스코드를 볼 수 있다.





0x88 == 136byte만큼 할당을 받았지만.

0x100 == 256byte를 입력받는다.


명백한 오버플로우 취약점이다.


이제 ROP공격을 위해 함수들의 주소를 구해야 한다.


1. read@plt, read@got

2. write@plt, write@got

3. bss

4. pop pop pop ret Gadget

4. systemoffset

5. readoffset


일일히 하면 시간이 걸리므로 pwntool 라이브러리를 이용한다.


payload를 구성 위해서 우리가 구해야 할 것은 


pppr과 readoffset systemoffset 세가지이다. 


objdump -d ropasaurusrex



pppr : 0x80484b6



objdump -d /etc/lib32/libc.so.6 | grep "system"



system offset : 0x3fe70



objdump -d /etc/lib32/libc.so.6 | grep "__read"



read offset : 0xd9880



일일히 하면 시간이 걸리므로 pwntool 라이브러리를 이용하여 

다음과 같이 Exploit Code를 만든다.




'pwnable' 카테고리의 다른 글

시스템 해킹이란?  (0) 2017.02.07

+ Recent posts