3omh4n
3omh4
3omh4n
  • 분류 전체보기 (65)
    • wargame - system (0)
      • DreamHack (9)
      • FTZ (5)
      • LoB (4)
      • pwnable.kr (1)
    • wargame - reversing (0)
      • DreamHack (5)
    • wargame - web (6)
      • webhacking.kr (3)
      • DreamHack (3)
      • HackCTF (0)
    • CS (21)
      • system (19)
      • reversing (0)
      • Linux (2)
    • python (5)
      • Flask (5)
    • C++ (3)
    • 개인기록 (2)
    • 이거저거 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

최근 댓글

최근 글

태그

  • ROP
  • BOF
  • error
  • ftz
  • Programming
  • Dreamhack
  • systemhacking
  • System
  • webhacking
  • pwntools
  • langage
  • Reversing
  • LOB
  • Devtools
  • hacking
  • flask
  • RELRO
  • hackerschool
  • C++
  • python

티스토리

전체 방문자
오늘
어제
3omh4n

3omh4

[System][Dreamhack] Exploit Tech: Hook Overwrite(1/2)
CS/system

[System][Dreamhack] Exploit Tech: Hook Overwrite(1/2)

2024. 1. 24. 22:23

후킹(hooking)은 코드 실행을 낚아채 다른 코드가 샐행되게 하는 것을 말하고, 이때 실행되는 코드를 훅(hook)이라고 한다.

 

후킹은 다양한 용도로 사용된다. 예를 들어 malloc과 free에 hook을 설치하면 소프트웨어에서 할당하고, 해제하는 메모리를 모니터링 할 수 있다. 이를 응용하면 함수 도입부에 모니터링 함수를 hook으로 설치하여 모든 호출 함수를 tracing 할 수 있다.

 

여기서는 hook overwrite와 one-gadget에 대해 공부할 것이다. Hook Overwrite는 Full RELRO가 적용되더라도 libc의 데이터 영역에 쓰는 것이라 Full RELRO를 우회할 수 있는 기법이다. Glibc 2.33이하에선 libc 데이터 영역에 malloc()과 free()를 호출할 때 함께 호출되는 hook이 함수 포인터 형태로 존재한다. 이 함수 포인터를 임의 함수 주소로 overwrite 가능하다. One-gadget은 단일 가젯만으로 쉘을 실행할 수 있는 가젯이다. Glibc의 버전이 높을수록 제약 조건을 만족하기 어려우므로 ubuntu 18.04(Glibc 2.27버전)에서 실습을 진행한다.

 

메모리 함수 훅

malloc, free, realloc hook

malloc, free, realloc은 libc.so에 구현되어 있다. readelf의 s옵션을 이용해 malloc, free, realloc의 심볼을 확인한 결과이다.

libc에는 디버깅 편의를 위해 훅 변수가 정의되어 있다. malloc의 경우, __malloc_hook 변수의 값이 null인지 검사하고, null이 아니라면 malloc을 수행하기 전에 __malloc_hook이 가리키는 함수를 먼저 실행한다. 이때, malloc의 인자는 훅 함수에 전달된다. free는 __free_hook, realloc은 __realloc_hook인 훅 함수가 존재한다.

훅의 위치와 권한

__malloc_hook, __free_hook, __realloc_hook 또한 libc.so에 정의되어 있다.

변수의 offset은 libc.so의 bss 섹션에 포함되어 있다. bss 섹션은 쓰기가 가능하므로, 이 변수들의 값은 조작 가능하다. 

Address, Offset, Size, EntSize

 

 

Hook Overwrite

공격 시나리오는 다음과 같다.

1. __malloc_hook을 system 함수 주소로 덮기

2. hook 실행 시, 기존 함수에 전달한 인자를 같이 전달해 주기 때문에, 인자로 "/bin/sh" 전달

아래의 코드는 hook overwrite에 대한 Proof-of-Concept(PoC)이다. 이 코드를 실행하면 쉘 획득되는 것을 확인할 수 있다.

// Name: fho-poc.c
// Compile: gcc -o fho-poc fho-poc.c

#include <malloc.h>
#include <stdlib.h>
#include <string.h>

const char *buf="/bin/sh";

int main() {
  printf("\"__free_hook\" now points at \"system\"\n");
  __free_hook = (void *)system;
  printf("call free(\"/bin/sh\")\n");
  free(buf);
}

 

Full RELRO가 적용된 바이너리에도 라이브러리의 훅에는 쓰기 권한이 남아있어, 이런 공격이 가능하다.

__free_hook과 같이 훅은 libc에 쓰기 권한으로 존재하는 함수포인터이며, free(), malloc()을 간접적으로 호출할 수 있기 때문에 공격에 악용되기 쉽니다. 또한, hook은 힙 청크 할당(malloc)과 해제(free)가 다발적으로 일어나는 환경에서 성능에 안좋은 영향을 끼치기 때문에, 보안과 성능 향상을 이유로 Glibc 2.34 버전 부터는 제거되었다.

 

'CS > system' 카테고리의 다른 글

[System][Dreamhack] Exploit Tech: Hook Overwrite - one_gadget  (0) 2024.03.11
[System][Dreamhack] Exploit Tech: Hook Overwrite(2/2)  (0) 2024.03.04
[System][Dreamhack] RELRO - RELocation Read-Only  (1) 2024.01.02
[System][Dreamhack] PIE - Position-Independent Executable  (0) 2023.12.26
[System][Dreamhack] Exploit Tech : Return Oriented Programming(ROP) - ret2main  (0) 2023.12.22
    'CS/system' 카테고리의 다른 글
    • [System][Dreamhack] Exploit Tech: Hook Overwrite - one_gadget
    • [System][Dreamhack] Exploit Tech: Hook Overwrite(2/2)
    • [System][Dreamhack] RELRO - RELocation Read-Only
    • [System][Dreamhack] PIE - Position-Independent Executable
    3omh4n
    3omh4n

    티스토리툴바