[Exploit] Return Oriented Programming (ROP chain)

2024. 9. 19. 15:16·Hacking/Pwnable
728x90
반응형

Return Gadget

ret로 끝나는 어셈블리 조각

원하는 명령어 + ret으로 이루어진 가젯들이다

가젯(gadgets) : 해당 프로그램이 사용하는 메모리에 이미 있는 기계 명령어

 

 

ROP chain

리턴 가젯을 사용하여 복잡한 실행 흐름을 구현하는데, 이를 통해 ret2libc, ret2dl-reslove, GOT overwiret 등 payload를 구성할 수 있다.

원하는 가젯들을 조합하여 원하는 흐름으로 이어지게 하기 때문에, 한번에 실행 흐름을 제어할 수 없을 때 주로 사용한다.

따라서 보통은 ret2libc 등과 조합하여, NX를 bypass 하기 위해 많이 사용된다

 

* 보통은 pie가 걸려있지 않아야 주소가 code, data segment의 주소가 변경되지 않기에 해당 보호기법이 없어야 사용하기 편함

 

가젯이 아니라 vtable의 함수 등을 조합해서 ROP chain을 만들어 사용하기도 함 

 

 

x86 vs x64

각자의 함수 호출 방식이 다르기 때문에 해당 함수 호출 방식에 맞게끔 인자를 전달하여 rop 체인을 구성해야한다.

 

x86 : 스택에서 인자를 가져옴

x64 : 레지스터에서 인자를 가져옴

 

따라서 버퍼오버플로우 발생으로 rop chain으로 익스할 때 x64의 경우, 인자를 설정하도록 pop rdi; ret와 같은 가젯으로 레지스터에 알맞은 인자를 설정하는 과정을 한 차례 더 거쳐주어야한다. 

 

 

system("/bin/sh") 으로 공격

1. 필요한 정보 구하기 - 가젯, bss segment, system함수의 offset
2. 실제 주소 획득  - system()과 "/bin/sh"
3. got overwrite, ret2libc 등을 이용하여 익스

 

gadget 정보 구하기

ROPgadget

명령어로 gadget의 주소를 구할 수 있다.

ROPgadget --binary 경로

해당 경로에 있는 프로그램의 바이너리파일의 가젯의 주소를 구할 수 있다

 

bss segment 구하기

* read로 overwrite 하려는 경우 read(0, bss, 8)을 하면 bss에 데이터를 입력받기 때문에 bss 영역에 "/bin/sh"를 넣을 수 있음

readelf -S 경로 | grep bss

해당 명령어로 bss 뿐만 아니라 다양한 segment를 구할 수 있음

 

libc에는 '/bin/sh'가 존재한다. 버퍼에 입력이 어려울 때는 libc에 있는 것을 찾아 쓸 수 있다. 

또한, lib의 경우 냊부에서 데이터사이의 거리 offset이 항상 같다.

 

Library 함수 주소 (실제 주소 획득)

print 함수이름

해당 명령어로 함수가 저장된 주소를 구할 수 있음

 

ASLR이 걸려있는 경우, 코드에 있는 함수와 사용하고자 하는 함수의 주소 차이는 항상 일정하기 때문에 

print 코드함수 - 사용하려는 함수

로 offset 차이를 구하여 overwrite 할 수 있다.

 

심볼 획득

심볼 e = ELF('./rop'), libc = 와 같이 설정해주면 이미 저장되어 있는 코드들의 요소인 plt, got를 알 수 있다.

(pwntools 이용)

e.plt['함수이름']
e.got['함수이름']

 

 

 

해당 정보들을 이용하여 조합하면 

연쇄적으로 가젯을 이용하면서 덮어쓸 수 있다

 

ret2libc를 이용하여 rop chain을 구성한것

https://m-in-zu.tistory.com/82 

 

[Pwnable] Return to Library

문제 : https://dreamhack.io/wargame/challenges/353 Return to LibraryDescription Exploit Tech: Return to Library에서 실습하는 문제입니다.dreamhack.io Environment Arch: amd64-64-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PI

m-in-zu.tistory.com

 

Question & Learn

PLT & GOT 내부 주소의 관계

헷갈렸던 점은 심볼을 통해 plt와 got의 정보를 알아낼 수 있는데, 왜 got의 값을 leak해야하는가? 에 관한 것이였다. 

plt => got의 주소

got => 함수의 실제 주소

이기 때문에 got의 값을 leak한다는 것은 got 주소의 값이 아니라 함수의 실제 주소 값을 leak하는 것이다. 

 

e.got['read'] 는 read의 실제 주소가 아니라 read@got의 주소를 가지고 있다는 것을 명심하자. 

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Hacking > Pwnable' 카테고리의 다른 글

[Mitigation] RELRO | RELocation Read-Only  (0) 2025.05.15
[Mitigation] PIE | Position Independent Executable  (0) 2025.05.12
[Exploit] Return to Library  (0) 2024.09.06
[Mitigation] ASLR  (0) 2024.08.25
[Mitigation] NX  (0) 2024.08.25
'Hacking/Pwnable' 카테고리의 다른 글
  • [Mitigation] RELRO | RELocation Read-Only
  • [Mitigation] PIE | Position Independent Executable
  • [Exploit] Return to Library
  • [Mitigation] ASLR
min_zu
min_zu
  • min_zu
    민주제도
    min_zu
  • 전체
    오늘
    어제
    • ._. (176)
      • AI (2)
        • DeepLearning (2)
        • CS231n (0)
      • Web (2)
        • ReactJS (0)
      • CS (83)
        • OS (7)
        • Data Structure (23)
        • Computer Architecture (8)
        • Computer Network (20)
        • Algorithm (25)
      • Linux (3)
        • KaliLinux (0)
        • Docker (1)
      • Hacking (83)
        • Write Up (25)
        • Pwnable (13)
        • Reversing (2)
        • Cryptography (12)
        • Web Hacking (4)
        • Window (6)
        • Network (7)
        • Web3 (13)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    Web
    Linux
    DataStructure
    Sort
    ComputerArchitecture
    DeepLearning
    OS
    AI
    Mac
    WinAFL
    Tree
    Search
    Graph
    UTM
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
min_zu
[Exploit] Return Oriented Programming (ROP chain)
상단으로

티스토리툴바