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~으로 시작해서 조건문에 걸리지 않는다.
위 페이로드를 실행하면,
쉘을 얻을 수 있다.
'시스템 해킹 (Pwnable) > Archive' 카테고리의 다른 글
x86와 x64에서 RTL을 이용한 페이로드 작성 시 주의점 (0) | 2021.09.01 |
---|---|
시스템 해킹을 위한 RTL(Return to Library) 기법 (0) | 2021.08.29 |
시스템 해킹을 위한 pwntools 명령어 (0) | 2021.08.24 |
최신 칼리 리눅스 pwn 설치, 오류 해결 (0) | 2021.08.24 |