본문 바로가기

reversing

(86)
rootkit - root [2] root 권한을 만들면서 찾아봤던 이론 내용을 정리하려고 함. linux 상에서 namespaces 개념과 관련된 user_namespace , 권핰 코드 관련 내용을 이해하는데 목표가 있음 namespace 개념c++에서도 namespace라는 개념이 나왔던것 같다.그때의 개념과 linux 상에서의 개념이 비슷한 맥락을 가지는 느낌이다.네임스페이스(namespace)'란 녀석으로 이름충돌을 미연에 방지할 수 있게 하는 역할을 했었다. 네임스페이스를 간단히 말하면, 관련있는 녀석끼리 모여있는 공간을 말한다.간단하게 설명하면 독립적?인 공간, 영역으로 구분하고 관리하는 개념이다. 그리고 리눅스 메뉴얼에서 namspace를 검색해보면 다음과 같이 나온다. A namespace wraps a global sy..
rootkit - root [1] 커널 버전마다 user의 credential을 처리하는 방식이 다양하다. kernel 2.6 버전 이전task_struct의 구조체에서 uid, euid와 같이 권한 설정 파일에 접근가능했음.하지만 차즘 차츰 변화했음 kernel 2.6 버전 이후? --> 확실하지 않음.task_struct의 권한? 관련 부분 내용을 struct cred 로 따로 분리하여서 관리하고 있음그래서 credential를 변경하기 위해서는 struct cred 구조체를 변경해줘야 한다. 사용되는 관련함수prepare_creds()commit_creds() prepare 함수를 이용해서 자신의 cred 구조체를 만든다. 그 후 원하는 설정으로 변경한다.그리고 coomit_creds 함수를 이용해서 등록하는 과정을 이용한다. 1)..
rootkit - vfs hooking [readdir,iterate] 루트킷 자료를 검색하다보면, 인터넷 자료를 뒤지다 보면 file operation에 readdir 함수가 존재한다. 하지만 리눅스 커널 3.11 버전 이후 부터는 readdir 함수가 사라졌다. 그래서 혹시나 되는지 싶어서 시도해본다. 대신에 int (*iterate) (struct file *, struct dir_context *); 라는 함수가 대신한다. 해당 함수의 원형은 /usr/src/kernel_version/include/linux/fs.h 확인하면 된다. 그러면 이제 저 함수의 인자를 살펴본다. 살펴보면 struct file* 는 우리가 아는 내용이다. struct dir_context* 를 살펴보면 우리가 원하는 부분을 찾을수 있다. struct dir_context; /*context..
inline function hooking 이것 저것 돌아다니다 보니 inline function hooking 이라는 기법이 있었다. 기본적인 후킹은 원래의 흐름을 변경시켜 원하는 행위를 하게하고 다시 돌려놓는(?) 기법을 말한다. 뭐.. 많이 사용하는 ssdt, iat 후킹 같은 기법들을 보면 기본적으로 함수 테이블이 존재 한다.그리고 그 함수 테이블의 하나의 entry, index를 수정하여서 원하는 흐름으로 동작하게 하는 기법이다.하지만 이러한 후킹 기법 같은 경우는 쉽게 검출할 수 있다.단지 함수 테이블만 검사해서 값을 체크하면 된다. 기본적인 함수 포인터 변조를 이용한 후킹 기법을 그림으로 표현한 것이다.이외에도 코드에 큰 영향을 주지 않는 asm을 찾아서 변경하고 다시 복귀 및 복구하는 intercept 후킹 같은 기법도 있다. 이와..
rootkit - 자료정리 task Virtual File System 관련 rootkit을 만들어 보려고 한다.프로세스의 task struct 부터 데이터에 접근하는 전체적인 매커니즘을 파악한 다음, 흐름을 변경할 vector를 파악한다.그 후, 관련 포인터와 구조체를 확인하고 변경한다.위와 같은 순서로 진행하려고 한다. 위의 struct file 구조체에서 중요 변수 중 f_op 값은 file_operation의 구조체를 가리키고 있다.struct file_operations { struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); ssize_t (*..
rootkit- syscall [2] Linux System call Hooking git : https://github.com/jhong3842/linux_rootkit앞서 자신을 숨기는 방법에 관해서 알아보았다.리눅스 자체에서 기능을 제공하는 함수가 많기에 함수를 잘 알고 많이 아는것이 중요하고 편한것 같다. 이제 syscall table을 수정하여서 원하는 함수로 hooking 하도록 해본다. 먼저 들어가기에 앞서..syscall table에는 각 함수에 해당하는 번호가 할당되어 있다.함수의 번호를 확인하고 싶으면 kernel 소스를 확인해보면 되는데 richong@ubuntu:~/LKM$ man syscall 과 같이 syscall 번호를 찾기 위해서 찾아보면.. NAME syscall - indirect system call SYN..
rootkit- syscall [1] Linux System call Hooking Linux 환경에서의 Driver를 이용하여서, system call을 후킹 방법에 관해서 공부하려 한다. 내용은 간단하고 쉽지만, 윈도우 환경에서의 api 함수와 차이가 있어서 함수도 정리하면서 진행한다. 먼저 간단한 LKM을 빌드하고 설치해 본다. #include // included for all kernel modules #include // included for KERN_INFO #include // included for __init and __exit macros MODULE_LICENSE("GPL"); // GPL == GNU Public License v2 또는 이상 // GPL과 호환되는 라이선스로 등록한 모듈에서만 해당 심볼들을 사용가능..
[Project] 디버거 만들기 [Python] 보호되어 있는 글입니다.