티스토리 뷰

한국어로된 Inline Function Hook Rookit 자료가 없더군요! 그래서 한 번 복습겸 올려보려고 합니다. 


Inline Function Hook 은 기존의 System Call Hooking보다 한 단계 진화된 방식입니다. 


이 System Call Hooking으로 만든 루트킷의 단점은 System Call Table 을 원본과 비교하면 변경된 System Call 부분을 전부 들킨다는 점에 있습니다. 이에 비해 이 Inline Fucntion Rootkit은 테이블을 변경하지 않고 후킹을 합니다. 자세한 원리는 예제 프로그램을 통해 차차 설명드리겠습니다. 참고한 자료는 : http://turbochaos.blogspot.kr/2013/10/writing-linux-rootkits-201-23.html


자 그러면 시작하겠습니다. 선행 지식은 System Call Hooking 입니다.  Inline Function Hook 은 포인터를 수정하는 대신에 해당 시스템콜을 직접 수정해버립니다. 이 번에는 readdir 을 변형해볼건데요. 물론 이 시스템콜은 어셈블리어를 수정하는 것이며 이 곳에 넣을 어셈블리어는 


push target address ;
ret

인하대 논문에는

mov eax target ;
jmp eax  

으로 하기도 했습니다. 즉 대입하는 어셈블리어가 고정되어있지는 않습니다. :)

제가 고민했던 부분은 역시 "그래 어셈블리어를 대입한다고 치자... 근데 해당 주소의 address는 어떻게 얻어올건데?" 였습니다. 


밑의 jacked_code 부분을 보시면 address 에 해당하는 1바이트가 x00 인 것을 확인할 수 있습니다. 이는 나중에 얻어서 대입됩니다.~





나름대로 주석을 달아보았는데요. 기능을 간단히 말씀드리면 위의 비어있던 jacked_code 부분에 주소를 채워주고 두 번째로 새로운 어셈블리로 기존의 어셈블리를 replace하기 전에 정보를 백업할 hook

struct를 생성한 후 이 정보를 백업하는 기능입니다. target은 기존의 함수 즉 readdir의 주소 new는 hacked readdir의 주소입니다. 




readdir address를 얻는 부분은  get_readdir 부분인데 제가 첨부해드린 소스코드를 보시면 쉽게 이해하실 수 있습니다. 


이제 jack_it 그리고 fix_it이 남았는데요. 이 두 함수는 어셈블리가 치환당한 readdir에 데이터를 씁니다. 여기서 바꾸는 것은 barriers 그리고 preemption control(레이스 컨디션을 방지해주는 것) 입니다.

barrier를 해놓으면 다른 곳으로 컨트롤이 넘어가지 않고 무조건 배리어가 끝날 때까지 어셈블리를 진행하게됩니다. preempt_disable() 도 마찬가지로 preemption 선점 즉 선점을 불가능하게 만드는 부분입니다. 

jack_it은 치환해주는 역활 fix_it은 복구하는 역할을 담당합니다. 




 rootkit.c

커널 2.6.32 에서 구동확인했구요 64비트도 가능합니다~


'시스템 보안' 카테고리의 다른 글

WHAT IS LKM BACKDOOR AND ROOTKIT  (0) 2016.05.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함