일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- sql
- 모의해킹
- 스캔
- Metasploit
- 메타스플로잇
- Samba
- Los
- Kioptrix
- 해킹툴
- load of sqlinjection
- 해킹
- 취약점분석
- 내부침투
- 시스템 해킹
- SQL Injection
- 스캐닝
- 암호해독
- 취약점 스캔
- CTF
- web hacking
- 취약점
- SQLINJECTION
- 칼리리눅스
- 침투테스트
- 포트스캔
- root권한
- Hacking
- smb
- 해킹도구
- 권한상승
- Today
- Total
감자 텃밭
[시스템] Return-Oriented-Programming - ROP [x86-32bit] 본문
[시스템] Return-Oriented-Programming - ROP [x86-32bit]
g2h 2021. 11. 22. 23:15블로그 이전중입니다. 아래 링크에서 확인 가능합니다. 😁
https://g2hsec.github.io/system-vuln/system-vuln-Return-Oriented-Programming-ROP-x86-32bit/
ROP기법이란 Return-Oreinted-Programming의 약자로 반환 지향형 프로그래밍 이다.
ret영역에 가젯을 이용하여 연속적으로 함수를 호출하며 공격자가 원하는
흐름대로 프로그래밍 하듯 공격한다는 뜻의 기법이다.
ROP는
ASLR, DEP/NX등의 메모리 보호기법을 우회하여 공격할 수 있는 기법이며,
해당 기법을 사용하기위해서는 몇가지의 사전지식이 필요하다.
우선 RTL, RTL-Chaining, PLT,GOT, GOT_Overwrite, Gadget등이 필요하다.
또한 해당 기법은
Stage0과 Stage1 로 나뉘어서 진행되게 된다.
첫번 째 Stage1 에서는 공격을 하기위해 필요한 요소들을 구하는 과정이고
두번 째 Stage0 에서는 Stage0에서 구한 요소들을 가지고 Exploit 하는 과정이다.
즉 Libc_base주와 함수의 실제주소, 가젯 등 필요 요소를 Stage1에서 구하고
이를 통해 Stage0 에서 Payload를 작성하요 Exploit을 하게되는 것이다.
x86-32bit 환경에서는 가젯을 구하기 어렵지 않지만 64bit 환경에서는 필요 레지스터가 존재한다
우선 32bit부터 살펴보도록 하겠다.
기본적인 원리부터 알아보자.
위와 같은 상황에서 Buffer Overwrite가 터져서 buf의 64바이트보다 더 많은 값을 입력받을 수 있을때
우리는 RET영역까지 접근이 가능하다. 여기서 RTL_Chaining와 같이 가젯을 사용하여, 함수를 호출하고, 인자를 정리하고 또 호출하고를 반복적으로 수행 할 수 있다.
이경우 보통 Stage1에서 해야할 작업으로, 출력함수를 이용하여 특정 함수의 got주소를 출력시킨 후,
출력된 함수의 got에서 그 함수의 offset값을 빼 libc_base주소를 구하게 된다.
이렇게 구한 libc_base주소를 가지고 우리가 원하는 보통 system()함수의 offset을 더해 system()함수의
실제 주소를 획득 할 수 있다.
그 후 "/bin/sh" 문자열이 저장되어있는 주소를 찾거나, 쓰기권한이 있는 .bss영역등에 해당 문자열을 저장하여 해당
/bin/sh 문자열을 쓸 수 있다.
그 후 got_overwrite를 통해 특정 함수의 got에 Stage1 단계에서 구한 system()함수의 주소를 덮어씌워
특정함수를 실행 시키게 되면 system()함수를 실행시키는 효과를 볼 수 있다.
그 후 Stage0에서 Exploit을 진행하게 된다.
Stage0의 단계를 보면 아래의 그림과 같이 이루어진다.
1. puts() 함수를 이용하여 puts()함수의 got주소를 출력시킨다. 출력시킨 Payload에서 특정 변수에 담아둔다.
그 후 puts_got - puts_offset를 통해 libc_base주소를 획득하고
libc_base - system_offset을 통해 system()함수의 실제 주소를 획득할 수 있다.
2. read()함수를 통해 .bss영역에 system()함수의 인자로 필요한 /bin/sh문자열을 저장하게 된다.
3. read()함수를 통해 puts()함수의 got에 앞서 얻은 system()함수의 실제주소를 저장하여 got_overwrite를 한다.
이로서 puts_plt를 호출하면 got를 참조하여 system()함수가 실행되게 된다.
그 후
모든 요소들을 payload로 작성하여 Stage1의 Exploit를 수행하면 된다.
위 사진과 같이 puts_plt를 실행시키면 내부적으로 system()함수가 실행되고 인자로
.bss영역의 주소를 주면 .bss영역에는 /bin/sh 문자열이 저장되어있기에
system(/bin/sh)이 실행되며 해당 명령 실행 후 더이상 작업이 없기에 AAAA로 끝나게 된다.
해당 ROP기법은 알아야 할 사전지식이 많으며, 그만큼 강력한 기법이다.
(참고로 got_overwrite를 사용하지않고 Stage1 단계에서 구한 system()함수의 주소를 바로 써도 된다.)
마지막으로 write()함수와 read()함수를 가지고 rop기법을 이용한 전체 Payload를 참고하자.
※ 내용이 이상하거나 문제가 있을경우, 또는 설명에 부족한 내용이 있으시면 알려 주시면 감사합니다.
'System > System Hacking Techniques' 카테고리의 다른 글
[시스템] mprotect ROP (1) | 2021.11.23 |
---|---|
[시스템] Return-Oriented-Programming - ROP [x64-64bit] (0) | 2021.11.23 |
[시스템] GOT Overwrite (2) | 2021.11.22 |
[시스템] RTL-Chaining (0) | 2021.11.21 |
[시스템] Return-to-Libc (RTL) (0) | 2021.11.20 |