본문 바로가기

High Level Technique/System Hacking

Return Oriented Programming (ROP) - final

Return Oriented Programming (ROP) - final



목표


ROP를 stage0, 1로 나누어 정확한 개념을 통해 이해해 보자.






설명



이번에 설명할 것은 step1, step2를 통해서 ROP를 어떻게 수행하는지에 대해서 알아봤습니다.

이번 step3에서는 좀 더 ROP에 대해서 자세하게 알아보도록 하겠습니다.



ROP는 stage0, 1에 따라서 실행을 합니다.



이번에 사용할 바이너리를 받아주세요. 

ROP


shayete 형 ㄱㅅ



해당 바이너리를 사용하는 법은 ./rop port 입니다.


해당 바이너리에는 아래와 같은 취약한 부분이 있습니다.




vuln이라는 배열에는 100만큼의 공간이 있지만 recv()를 통해서 200만큼 받을 수 있게 해두었습니다. 따라서 BOF가 발생할 수 있습니다.


먼저 rop 바이너리를 실행시킵니다. 저는 포트로 9999를 이용하겠습니다.





nc를 이용하여 실행시키면 아래와 같이 출력됩니다.







stage1 - 시스템 주소 찾기


ROP에서 Stage1은 시스템 주소를 얻는 과정을 말합니다. 

rop바이너리는 서버로 실행되어 돌아가기 때문에 해커는 recv, send를 이용하여 공격을 해야합니다.

help라는 함수에서 recv를 이용하여 해커가 보내는 값을 받아서 vuln에 저장을 하는데 반대로 서버에서 send를 하면 해커는 recv로 받으면 되겠죠.



서버에서 send를 이용하여 system의 주소를 가져오도록 할 것입니다.



send@plt 주소 찾기





puts 주소 찾기


puts@got를 Overwrite 해서 system을 실행시켜 쉘을 얻을 것입니다. 






offset 구하기


offset을 구하는 이유는 실행되는 함수들이 주소가 달라질 수 있기 때문에 거리차이를 계산하여 나중에 실행할 때 거리 값만 계산하여 넣어주면 되기 때문에 offset을 구합니다.


출력되는 값들을 보면 puts가 사용 되었을거라 생각됩니다. 그래서 puts와 system사이의 거리를 알아보도록 하겠습니다.







먼저 간단하게 서버에서 send()를 실행시키도록 해서 puts_got의 값을 가져오도록 해보겠습니다.




해당 파일을 실행하면 아래와 같은 결과가 출력됩니다.




하단에 출력된 이상한 값은 해당 바이너리가 실행되면서 사용되는 puts의 주소입니다.


그러면 실제로 실행되는 puts의 주소를 알아냈으니 offset를 이용하여 실제 실행되는 system의 주소를 알아보도록 하겠습니다.





위와 같이 파이썬 코드를 작성하여 실행하면 아래와 같이 system의 주소가 나타납니다.






여기까지가 stage 1 과정이였습니다.







stage0 - 얻은 시스템 주소로 공격한다.



recv@plt 찾기


해커가 send를 통해서 보내면 서버에서는 recv를 통해서 받아야 하겠죠. recv를 호출시켜서 /bin/sh를 넣어 실행 시키도록 하겠습니다.












.bss section 찾기











ppppr 찾기


send()의 파라미터가 4개이므로 ppppr를 찾아야 합니다. 



pop pop pop pop ret 의 시작 주소는 0x804980c 입니다.




이제 stage0에 대한 페이로드를 작성합니다.














최종 페이로드








쉘이 실행되는 것을 알 수 있습니다.