[시스템] Return-Oriented-Programming - ROP [x86-32bit]

2021. 11. 22. 23:15·System/System Hacking Techniques

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
[시스템] Memory-leak 메모리 누수  (0) 2021.11.22
[시스템] GOT Overwrite  (2) 2021.11.22
[시스템] Gadget 가젯  (0) 2021.11.22
'System/System Hacking Techniques' 카테고리의 다른 글
  • [시스템] mprotect ROP
  • [시스템] Return-Oriented-Programming - ROP [x64-64bit]
  • [시스템] Memory-leak 메모리 누수
  • [시스템] GOT Overwrite
g2h
g2h
  • g2h
    감자 텃밭
    g2h
  • 전체
    오늘
    어제
    • 분류 전체보기 (144)
      • Network (4)
      • Web (31)
        • Web Hacking Techniques (31)
      • System (32)
        • Tips (11)
        • System Hacking Techniques (21)
      • Pentest (14)
        • Pentest (14)
      • WriteUP (47)
        • sec (0)
      • 도구|Tools (12)
      • Security Issue (3)
      • 1-Day-Analysis (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    해킹툴
    dom based xss
    DoM
    load of sqlinjection
    web hacking
    권한상승
    취약점
    sql
    vulnability
    CTF
    침투테스트
    취약점 스캔
    skt 해킹
    Hacking
    NOSQL
    해킹
    Kioptrix
    XSS
    Metasploit
    해킹도구
    Encoding
    모의해킹
    스캐닝
    SQL Injection
    스캔
    Reflected XSS
    nosql injection
    Los
    내부침투
    cross side script
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
g2h
[시스템] Return-Oriented-Programming - ROP [x86-32bit]
상단으로

티스토리툴바