이것 저것 돌아다니다 보니 inline function hooking 이라는 기법이 있었다.
기본적인 후킹은 원래의 흐름을 변경시켜 원하는 행위를 하게하고 다시 돌려놓는(?) 기법을 말한다.
뭐.. 많이 사용하는 ssdt, iat 후킹 같은 기법들을 보면 기본적으로 함수 테이블이 존재 한다.
그리고 그 함수 테이블의 하나의 entry, index를 수정하여서 원하는 흐름으로 동작하게 하는 기법이다.
하지만 이러한 후킹 기법 같은 경우는 쉽게 검출할 수 있다.
단지 함수 테이블만 검사해서 값을 체크하면 된다.
이외에도 코드에 큰 영향을 주지 않는 asm을 찾아서 변경하고 다시 복귀 및 복구하는 intercept 후킹 같은 기법도 있다.
이와 유사하게 inline function hooking을 알아본다. 해당 명칭이 맞는지는 모르겠다... 그냥 외국 블로그에서 사용하길레 들고왔다~
그림으로 표현하였다.
먼저 함수 테이블의 포인터는 수정하지 않는다. 대신에 함수의 시작 부분을 수정한다.
시작 부분에 push addr, pop ret와 같이 흐름을 변조하는 코드 조각을 넣어 놓는다.
그러면 실행 흐름은 내가 원하는 addr[my_read] 부분에 도달 했을 것이다.
그리고 나서는 이제 각자의 마음데로 수정하면 된다.
예를들어 password.txt를 읽게 한다고 하면, 기존의 read()함수를 실행하지 않고 다른 넘어가게 한다.
반면에 다른 파일을 일게 한다고 하면, 원래의 read() 함수를 호출하여서 실행 흐름에 문제가 없게한다.
그리고 마지막에 my_read() 함수를 리턴하려고 할 때, 다시 read 함수를 변조 한 다음 return하게 한다.
좀 더 간단하게 표현한 자료가 있어서 첨부한다.
코드 조각
#if defined(__i386__)
#define csize 6 /* code size */
#define jacked_code "\x68\x00\x00\x00\x00\xc3" /* push addr; ret */
#define poff 1 /* offset to start writing address */
#else
#define csize 12 /* code size */
#define jacked_code "\x48\x8b\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe0" /* mov rax,[addr]; jmp rax */
#define poff 2 /* offset to start writing address */
#endif
[참고] http://www.malwaretech.com/wp-content/uploads/2015/
[참고] http://turbochaos.blogspot.kr/2013/10/writing-linux-rootkits-201-23.html
'reversing > reversing' 카테고리의 다른 글
C++ 리버싱 연습 [2] -이론 (0) | 2018.03.10 |
---|---|
SMT - z3[sudoku] (0) | 2018.01.24 |
[Project] 디버거 만들기 [Python] (0) | 2017.03.30 |
MIPS Disassemble (0) | 2017.03.30 |
MIPS Instruction[Assembly] (0) | 2017.03.29 |