본문 바로가기

reversing

pintool 이번 포스팅에서는 pintool 사용법 및 예제코드에 대한 간단한 분석을 진행한다. pintool 이란, Intel PIN SDK 를 이용해 개발한 라이브러리이다. PIN 이란 프로그램의 플러그인(?) 이라 생각하면 될 것 같다. 혹여나 설치를 하지 못했다면, http://woosunbi.tistory.com/170 을 참고하기 바란다. 기본적인 사용 방법은, # ./pin -t [ .so 파일] -- [분석하고자 하는 파일] # Instrumentation Granularity : Pin 의 Instrumentation Granularity 에 따라 4가지 방식으로 Binary Instrumentation(Just in time) 이 가능하다. 1. Trace Instrumentation (TRACE_.. 더보기
code injection Code Injection : 상대방 프로세스에 독립 실행 코드를 삽입한 후 실행하는 기법. CreateRemoteThread() API 이용해 원격 쓰레드 형태로 실행. DLL Injection 과 다르게 흔적을 찾기 어렵고, 메모리를 적게 차지한다. Code Injection 시 고려해야 하는 사항은, Release 모드 빌드 - Debug 모드로 빌드를 하게 되면 코드 중간에 디버깅을 위한 코드가 삽입되어 정확한 크기 알 수 없다. 최적화 옵션 /0d - 최적화 옵션을 해체하여 컴파일러에 의해 소스코드가 최적화 되는 것을 막는다. DEP 해체 - 실행 코드가 정상적으로 동작하지 않음.. 더보기
angr angr 은 binary analysis framework 로 Shellphish 팀에서 만들었다. 자세한 기능은 잘 알지 못하지만, symbolic excution을 가능하게 해주어 CTF 할 때 편리하다.. 엄청.. symbolic excution 은 특정 값이 아닌 문자로 변환하여 프로그램을 구동시키는 방식을 의미한다. ex ) x + y = 5, x - y = 3 https://github.com/angr/ 위의 github 에 들어가면 설치 방법이나 사용 방법에 대해 알 수 있다. 위의 사이트나 다른 블로그를 참조해서 설치하려 했지만 여러가지 오류로 인해서 미친듯이 검색을 해서 힘들게 설치했다. 혹여나 환경을 맞춰주고 똑같이 진행했음에도 오류가 되는 분들은 아래 명령어를 따라해보시길.. # pi.. 더보기
gdb child process debugging GDB 에서는 fork()이후에도 디버깅할 수 있는 기능을 제공한다. 기본적으로 fork() 이후에는 parent process 만 계속 디버깅 된다. 만약, child process 에 bp 를 설정할 경우 SIGTRAP 시그널을 받고 종료된다. 이러한 문제점을 해결하기 위한 방법은 child process 에 sleep 을 걸고 pid 를 얻어 attach 하는 방법이 있다. 하지만, Linux Kernel 2.5.46 이상에서는 gdb를 사용하여 fork 또는 vpork 에 대한 디버깅 기능을 지원한다. set follow-fork-mode child 위와 같이 설정할 경우 fork() 후에 child process 가 디버깅 되어진다. parent process 는 계속 실행된다. 기본 값은 pa.. 더보기
IDA remote gdb debugging with gdbserver gdbserver와 ida 의 remote gdb debugger 기능을 이용하여 elf binary를 디버깅할 수 있다. # apt-get install gdbserver // 다음 명령 한 줄이면 gdbserver 를 받을 수 있다. # gdbserver 127.0.0.1:[port] ./[file] IDA 로 가서.. ida 에서 [Debugger] - [Select a debugger] - [Remote GDB debugger] 선택한다. 그리고 [Debugger] - [Process options] 에 들어가서 hostname과 port 를 지정해주고 시작하면 debugging 이 되는 것을 확인할 수 있다. 더보기
예외 처리를 이용한 Anti-Debugging 강력한 Anti-Debugging 기법은 아니지만 예외 처리를 이용한 Anti-Debuggging 기법에 사용할 수 있다. 바로 코드를 살펴보자. #include #include void AntiDebugging() { DWORD dwDebugger = 1; __try { __asm { __emit 0xCC // INT 3 } } __except(EXCEPTION_EXECUTE_HANDLER) { dwDebugger = 0; printf("No Debugging\n"); } if(dwDebugger) { printf("Debuggingt\n"); ExitProcess(0); } } int main() { AntiDebugging(); return 0; } 위의 소스코드를 실행하면 정상적이라면 "No De.. 더보기
windbg kernel debugging vmware, windbg를 이용하여 kernel debugging 을 할 것이다. 구글에 검색해보면 관련 글에 대해 소개한 블로그가 많이 있다. 처음 kernel debugging을 해보기 위해 여러 블로그들을 따라해보았지만 알 수 없는 오류로 인해서 약간의 삽질을 해서.. 이러한 삽질을 하고 있는 사람들에게 좀 더 도움이됬으면 하는 마음으로 글을 쓴다. 우선, Debuggee(Test System) VMware 설정을 해보도록 하겠다. 1. serial port 추가 [Edit virtual machine settings] - [Add] 까지 클릭한다. Serial Port 를 선택한 후 Next Output to named pipe 체크 한 후 Next Name pipe 다음과 같이 설정한 후 Fi.. 더보기
BSWAP instruction BSWAP 어셈블리어 명령은 "Byte SWAP" 이다. 바이트를 교환하는 명령으로 빅 엔디언과 리틀 엔디언을 변환한다. ex ) EAX = 0x78563412 일 때, BSWAP EAX 명령을 사용하면 EAX = 0x12345678 이 된다. 더보기
assembly jump instruction 명령어 부등호 플래그 조건 JA(jump if(unsigned) above) > CF=0 and ZF=0 JAE(jump if(unsigned) above or eaul) >= CF=0 or ZF=1 JB(jump if(unsigned) below 더보기
프롤로그(prolog), 에필로그(epilog) 프롤로그와 에필로그는 함수 호출 시 과정으로,​ ​ 프롤로그는 일반적으로 스택의 프레임(Stack Frame)을 생성하기 위한 과정이다. 다음 어셈블리어로 스택 프레임을 구성한다. push ebp mov ebp, esp 에필로그는 스택의 프레임(Stack Frame)을 해제하기 위한 과정이다. 즉, 함수 호출이 끝난 후 처음 호출한 지점으로 돌아가기 위해 스택을 복원한다. 다음 어셈블리어로 스택을 복원한다. mov esp, ebp pop ebp 더보기