레이블이 programming인 게시물을 표시합니다. 모든 게시물 표시
레이블이 programming인 게시물을 표시합니다. 모든 게시물 표시

c로 작성된 python module 만들기

c로 작성된 python module 만들기

C로 작성된 함수를 파이썬에서 import 해서 사용하기 위해서는 C로 작성된 프로그램 코드를 파이썬이 import할 수 있는 라이브러리 파일로 변환해 주어야 한다. (ubuntu 환경에서 할거임)

swig(Simplified Wrapper and Interface Generator)라는 툴을 사용하면 간단히 라이브러리파일로 만들어 낼 수 있다. swig는 파이썬뿐만 아니라 다른 언어에서도 C코드를 사용가능하게 라이브러리를 만들어주는 툴이다. 

설치
sudo apt-get install swig 
공식 홈페이지
www.swig.org


위의 간단한 코드를 라이브러리로 만들어서 파이썬에서 실행 시켜보자.
ex.c파일을 이용해서 ex.i 파일을 만들어줘야 한다. 보통 컴파일러를 사용하면 전처리기가 해주는 작업을 비스무리하게 직접하여 .i파일을 만들어 줘야 한다.

첫 번째 줄에는 %(module name)이 들어가고
%{
이 부분에는 사용하는 함수들의 선언, 전역변수(구조체)의 선언, define, 헤더파일을 extern으로 선언해준다.
%}
그리고 그 밑에는 그냥 한 번 더써준다. 


ex.c 파일과 ex.i 파일이 준비가 되었다. 이제 swig를 이용해서 만들면 된다.
swig -python ex.i
명령어를 실행하면 ex_wrap.c와 life.py가 생성된다. life는 모듈이름이고 ex는 c코드 파일명이다.
gcc -fpic -c ex.c ex_wrap.c -I/usr/include/python2.7
object 파일 두 개(ex.o ex_wrap.o)가 생성되었다. -I뒤에는 Python.h 를 참조할수 있게 파이썬이 설치된 경로를 넣으면 된다. 나머지 옵션은 man gcc에 들어가면 확인할 수 있다.
ld -shared ex.o ex_wrap.o -o _life.so
_life.so 파일을 뽑아준다. .so 파일이름은 반드시 _(module name)으로 해야한다.
python 을 실행하고 import 해서 사용할 수 있다.
굳~

C로 작성된 함수에서 인자로 포인터를 받는 경우 그냥 느낌에 맞게 넣자(char * 는 string형으로)
ctype의 (c_char_p) 이런걸로 형 맞춰줘도 되지 않는다.

unsigned char * 같은 걸 넘겨주려면 string (char *)으로 넘겨주고 C코드 안에서 인자를 받자마자 강제 형변환을 해버리니 잘 된다. 
ex) argv[1] = (unsigned char *)argv[1]

함수의 결과 값을 return으로 받지 않고 argv의 구조체 인자로 받으면 받아지지 않는다.
Read more

DKOM 을 이용한 process 은닉 코드

DKOM(Direct Kernel Object Manipulation)은 직접 커널 옵젝트를 수정하여 원하는 결과를 얻는다.
DKOM는 커널 옵젝트를 수정해야하기 때문에 일반적으로 DDK를 이용하여 드라이버를 작성하여 구현 한다.

드라이버를 작성할 때는 DDK에서 제공하는 PsGetCurrentProcess() 가 현재 프로세스의  EPROCESS(KPROCESS)의 시작주소를 리턴하기 때문에 쉽게 entry_list의 flink, blink로 접근을 할 수 있고 쓰기 권한도 있기 때문에 숨기고자 하는 프로세스와의 링크를 다 끊어버리고 전, 후 프로세스를 다시 연결해주기만 하면 프로세스를 은닉 할 수 있다. 

드라이버를 작성하지 않고 winapi 만 사용하여 구현할 수도 있다.
NtQuerySystemInformation을 사용하여 커널 옵젝트에 접근 하고 AdjustTokenPrivilige로 프로세스에게 debug권한을 주고 NtSystemDebugControl를 사용해 가상메모리를 씀으로 커널 옵젝트를 수정 할 수 있다.

아래의 코드는 windows xp sp3에서 PID를 입력받고 그 process 은닉을 한다.

Read more

code injection

code injection은 다른 프로세스에 내 코드를 심어 다른 프로세스가 내 코드를 수행하게 한다.

코드 인젝션의 코드를 간략히 설명해보면
1. 인젝션 할 코드(기계어)도 내 프로세스 메모리에 올라간다.
2. 인젝션 대상 프로세스를 suspend로 생성하고
3. 내 프로세스 메모리를 모두 읽어서 인젝션 대상 프로세스에 쓴다.
4. context 구조체로 eip를 injectedCode() 함수시작로 맞춰주고
5. 인젝션 당한 프로세스를 실행 시킨다.

*injectedCode() 는 내 프로세스에 맞게 컴파일된 기계어이므로 함수의 주소를 못찾아갈수도 있기 때문에 dll을 동적으로 로드해 주어야한다.




이 코드를 실행하면 svchost.exe라는 프로세스가 생성되어 injectedCode() 함수 안의 코드를 실행 한다.(위의 코드는 선언등이 빠져 실행되지 않는다.)
Read more

mutex를 이용한 중복실행 방지


운영체제는 컴퓨터 자원을 안전하게 관리하여야 한다.
critical resource 에 대해 경쟁 관계가 있는 프로세스들이 존재하는 경우에 Mutual exclusion, deadlock, starvation의 제어 문제가 발생 할 수 있다.

deadlock은 세마포어를 사용하여 해결 할 수 있다. 세마포어는 카운트 값을 주고 critical section에 접근 할 수 있는 프로세스의 수의 제한을 두어 프로세스가 자원을 점유할 때 카운트를 -1 해주고 자원을 반납할 때 +1 해주는 식으로 deadlock을 해결한다.
Mutex는 2진 세마포어와 비슷하다.(카운트 = 1, 쓰레드) 자원에 오로지 하나의 쓰레드만 접근 할 수 있게 한다.

Mutex를 사용하여 중복 실행 방지코드를 작성해보자.



CreateMutex 함수로 MutexInstance를 생성(3번째 인자가 고유네임)한다.
CreateMutex 함수를 호출 하였는데 고유네임으로 이미 뮤텍스가 생성 되 있다면 CreateMutex함수는 ERROR_ALREADY_EXISTS 에러를 리턴하게된다.
프로세스 메인 쓰레드에 MutexInstance를 생성해 놓으면 CreateMutex 함수의 에러코드를 확인해 중복 실행을 방지 할 수 있다.
Read more

walking process & DLL loading

현재 메모리에 올라가 있는 process 목록을 구하는 api

 CreateToolHelp32Snapshot()
 Process32First()
 Process32Next()

walking process API를 이용해 explorer.exe 프로세스를 찾아서 explorer.exe의 자식 프로세스들을 모두 종료 시키는 코드


악성코드의 DLL injection api

 GetProcAddress()
 LoadLibrary()
 CreateRemoteThread()





Read more