감자 텃밭

[시스템] mprotect ROP 본문

System/System Hacking Techniques

[시스템] mprotect ROP

g2h 2021. 11. 23. 02:58

보통 ROP는 Dynamic Link 바이너리에서 plt와 got를 이용하여 해결하는 기법이다.

하지만 주어진 바이너리파일이 Dynamic Link된 파일이 아닌

Static Link된 파일일 경우 사용할 수 없게 된다.

 

필요한 모든 함수구현 코드들이

실행파일 안에 존재하기 때문이다 하지만 해당 함수코드중 system()함수가 없는 경우 공격이 힘들어진다.

 

이렇게 system()함수가 존재하지않고 Static Link된 바이너리 파일에서의 ROP공격을 하기 위한 기법이

mprotect ROP이다. 특정 메모리 영역에 ShellCode를 삽입하여 사용하는 기법이다.

 

일단 해당 ROP를 하기위해서는 mprotect 함수에 대해 우선적으로 알아보자.

 

mprotect() 함수는 할당된 메모리 영역의 권한을 변경하는 함수이다.

함수의 원형은 아래와 같다.

함수원형 
- int mprotect (void *addr, size_t len, int prot);

- 여기서 void *addr은 접근을 제어할 주소이며, 값은 0x1000 즉 4096의 배수여야 한다.
(addr의 값은 페이지 경계에 맞게 정렬 되어 있어야 하며, 페이지의 크기는 4096이다.)
- len은 주소 기준으로 관여할 길이이며,
- prot는 다음 값들의 비트 or 값이다.
(쉽게 생각해서 rwx와 같이 권한이라 생각하면된다.)

● PROT_NOTE : 접근할 수 없다.
● PROT_READ : 일기
● PROT_WRITE : 쓰기
● PROT_EXEC : 실행

반환값 : 성공 - 0, 에러 - -1 반환

주의할 점
  - mprotect [주소값] 부터 [주소값 + 길이-1]를 포함하는 메모리 페이지의 접근 권한을 수정하는 것
  - 전달되는 매개변수 addr은 반드시 정렬된 boundary여야 한다.

해당 기법의 강력한 장점은 NX메모리 보호기법이 걸려 있다 하더라도

ShellCode를 실행시킬 수 있다는 점이다.

 

NX 메모리 보호기법으로 실행권한이 없더라도

mprotect() 함수를 사용하여 사용할 영역에 실행권한을 줄 수 있기 때문이다.

 사용할 영역은 보통 ASLR이 걸려있더라도 주소값이 바뀌지 않는

고정된 영역인 .bss 영역에 ShellCode를 저장한다.

 

해당 기법을 적용시킨 문제는 아래에서 확인할 수 있다.

https://hg2lee.tistory.com/39

 

[HackCTF] Look at me

이번에 풀어볼 문제는 hackctf의 lookatme라는 문제이다 일단 제목으로는 추측이 안된다!! 해당 프로그램을 실행시켜 보았다. 해당 프로그램을 실행시키면 hellooooooooooo라는 문자열과 특정 값을 입력

hg2lee.tistory.com

참고자료
https://dokhakdubini.tistory.com/421

※ 내용이 이상하거나 문제가 있을경우, 또는 설명에 부족한 내용이 있으시면 알려 주시면 감사합니다.