일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- HackCTF
- 포너블
- hacking
- vcruntime.dll
- Msvcrt.dll
- Windows Kernel Driver
- 개발하기
- 개발 환경 준비
- IAT Hooking
- windows kernel debugging
- 해킹
- 윈도우 커널 디버깅
- 시스템해킹
- arudino
- 윈도우 커널
- ucrtbase.dll
- Windows Kernel Debug
- 네트워크 바이트 오더
- Windows Kernel
- 바이트 오더
- vcruntime140.dll
- Windows
- packet capture
- 윈도우 커널 드라이버
- pwnable
- apphelp.dll
- Network Byte Order
- pcap packet capture
- pcap packet
- C언어 패킷캡쳐
- Today
- Total
미친해커
[Reversing] Trampoline(Inline) Hooking x86 Step 0 본문
Trampoline Hooking
Trampoline Hooking 이란 타겟 API의 상위 n바이트를 jmp 어셈블리로 패치하여 후킹하는 기법을 말한다.
Trampoline Hooking은 x86과 x64에서의 기술 구현 방법이 미세하게 다르다. 그렇기 때문에 위 설명에서 n바이트라고 하였다.
How to Trampoline Hooking from x86 system
x86 시스템에서의 후킹 방법은 다음과 같다.
타겟 API의 상위 5바이트를 jmp 어셈블리로 패치하여 후킹한다. 여기서 5바이트인 이유는 x86 시스템은 주소체계가 4바이트이기 때문에 1바이트는 opcode 나머지 4바이트는 점프할 주소이다. (4바이트 jmp 어셈블리의 opcode는 0xE9 이다)
그렇다면 만약 우리가 점프하고 싶은 주소가 0x11223344 라면 다음과 같이 패치를 한다고 생각할 수 있다.
하지만 위와 같이 코드 패치를 진행한다면 프로그램은 정상적으로 동작하지 않는다. 왜냐하면 opcode 0xE9는 jmp 할 주소를 상대 주소로 계산하기 때문이다. 즉 현재 주소로부터 점프할 주소까지의 상대적인 거리를 구해서 operand를 설정해줘야 한다.
How to calculate relative address for use opcode 0xE9
opcode 0xE9의 operand로 사용되는 상대 주소를 구하는 방법은 다음과 같다.
operand = TargetAddress - CurrentAddress - 5
혹시라도 왜 5를 빼는지가 궁금하다면 이유는 opcode 0xE9의 총길이가 5바이트이기 때문에 그래서 해당 길이만큼 빼주는 것이다.
마무리
이번 포스팅에서는 Trampoline Hooking의 대해서 간단하게 알아봤다. 필자는 IAT Hooking보다 Trampoline Hooking이 훨씬 구현하기 쉬우며 또 알아야 하는 배경지식도 더 적다고 생각한다. 그렇기 때문에 필자는 IAT Hooking은 한 번도 해본 적이 없으며 블로그를 쓰기 위해서 처음 공부하고 구현해봤다 ㅋㅋㅋㅋㅋ
'Reversing > Hooking' 카테고리의 다른 글
[Reversing] Trampoline(Inline) Hooking x86 Step 2 (0) | 2022.04.29 |
---|---|
[Reversing] Trampoline(Inline) Hooking x86 Step 1 (0) | 2022.04.27 |
[Reversing] IAT Hooking Step 2 (0) | 2022.02.03 |
[Reversing] IAT Hooking Step 1 (0) | 2022.01.22 |
[Reversing] IAT Hooking Step 0 (0) | 2022.01.19 |