ROP(Return Oriented Programming)를 이용한 시스템 해킹

oolongeya

·

2021. 9. 12. 18:23

이 게시글은 Protostar stack7 문제를 다룰 것이다.

x86 기반의 문제 파일이 필요하다

 

디버깅을 해서 system()의 주소, /bin/sh의 주소를 확인한다

 

패턴을 이용해서 스택의 첫 요소까지의 값(패딩  값)을 확인한다.

위의 Invalid $PC address : 0x41414a41 부분이 걸린 부분이다.

따라서 해당 값 0x41414a41 을 복사해서

patter offset 0x41414a41 를 입력하면 된다.

 

 

위의 내용들로 페이로드를 구성하면, 아래 처럼 작성할 수 있을 것이다.

 

 

하지만 이 방법으로 쉘을 얻을 수 없다. sys의 주소가 ret에 들어가서 조건문에 막히기 때문

 

즉 ret에 system()의 주소가 아니라, ret 명령어가 있는 곳을 넣는다.

ret -> ret 주소 2번을 하게되는데, 첫번째 ret과 다르다.

 

첫번째 ret에는 조건문이 걸려있고 system() 주소를 넣으면 바로 걸리지만

ret의 주소를 넣어서 지나갈 수 있다.

 

두번째 ret에서는 다음 주소를 가져와서 ret 하기때문에 조건문과 상관이 없다.

 

ret의 주소는 disas main을 통해 알아낼 수 있다.

위 경우는 단순한 예제라 쉽게 ret의 주소를 구하면 되지만,

gdb-peda의 ropgadget과 ropsearch 명령어를 이용해서 문제를 풀어야하는 경우도 있다.

 

pop ret 라는 건 ret 다음 정보를 빼는 것이다.

 

ret

dummy

dummy

 

인 경우

 

pop2ret 를 해서 pop pop 를 통해 dummy 2개를 뺄 수 있는 것이다.

필요한 상황에 사용하면 된다.

 

따라서 얻은 ret 주소로 새롭게 페이로드를 작성하면,

 

이렇게 작성할 수 있다.

ret_addr이 0x80~으로 시작해서 조건문에 걸리지 않는다.

 

위 페이로드를 실행하면,

 

쉘을 얻을 수 있다.

반응형