Reverse Engineering
-
[리버싱 핵심원리 study] 34장 고급 글로벌 API 후킹 - IE 접속 제어Reverse Engineering 2021. 1. 29. 21:22
이번 실습에서는 IE를 후킹 하여 의도하지 않은 다른 사이트로 접속을 우회시키는 방법을 공부해본다. (32bit windows 7 환경에서 진행하였다.) 1. 후킹 대상 API API 후킹을 할 때는 어떤 API를 후킹 할지 선정하는 것이 가장 중요하다. 우선 VirtualBox의 Windows 7 32bit의 IE를 실행시킨 후, Process Explorer로 IE를 관찰해보자. 위와 같이 iexplore.exe 프로세스에 로딩된 dll을 확인해보면 그중 wininet.dll이 로딩된 것을 확인할 수 있다. wininet.dll에는 InternetConnect() API라는 것이 있는데 해당 API는 웹사이트에 접속하려고 할 때 사용되는 API이다. API의 형태는 다음과 같다. void Intern..
-
[리버싱 핵심원리 study] 33장 '스텔스' 프로세스Reverse Engineering 2021. 1. 26. 21:43
API 코드 패치를 이용한 API 후킹 방법에 대해 실습한다. 32장에서 사용한 IAT 후킹 기법은 API가 프로세스의 IAT에 존재하지 않을 경우 후킹이 불가능한 반면 API 코드 패치 기법은 그런 제약이 없어 가장 널리 사용되는 방법이다. 또한 이번 실습에서 나아가 모든 프로세스를 후킹 하는 글로벌 후킹(Global Hooking)과 보다 효율적인 핫 패치 방법에 대해 알아본다. 1. API 코드 패치 동작 원리 이전 IAT 후킹 방식에서는 프로세스의 특정 IAT 값을 조작해서 후킹을 진행하였다. 코드 패치 방식은 실제 API 코드의 시작 5 byte 값을 JMP XXXXXXXX(XXXXXXXX는 사용자가 새롭게 정의한 함수)로 변경하여 후킹 함수로 제어를 넘기는 방식이다. 실습에서는 후킹하려는 대상..
-
[리버싱 핵심원리 study] 32장 계산기, 한글을 배우다Reverse Engineering 2021. 1. 22. 22:33
DLL 인젝션은 동작 원리와 구현이 비교적 간단하다는 장점이 있지만, 대상 프로세스의 IAT에 후킹을 원하는 API가 존재하지 않는 경우 사용할 수 없다는 단점이 있다. 이번 실습에서는 계산기에 DLL을 인젝션 하여 숫자 대신 한글이 출력되도록 API 후킹을 진행한다. 1. 대상 API 선정 PEView를 통해 calc.exe에서 임포트하는 API들을 확인해보자. 위와 같이 SetWindowText() API가 IAT에 있는 것을 확인할 수 있는데, 해당 API는 텍스트 에디터에 문자열을 출력해주는 기능을 한다. SetWindowText의() API의 구조는 다음과 같다. BOOL SetWindowTextA( HWND hWnd, LPCSTR lpString ); API의 hWnd는 윈도우 핸들이고, lp..
-
[리버싱 핵심원리 study] 30장 메모장 WriteFile() 후킹Reverse Engineering 2021. 1. 18. 19:38
이전 29장 스터디 내용의 테크 맵 중 debug 방법에 대한 실습이다. kernel32.dll의 WriteFile() API를 후킹 하여 기존과는 다른 동작을 하도록 만든다. debug 방식의 장점은 debugging을 사용함으로써 사용자와 더 interactive 한 후킹을 수행할 수 있다는 점이다. 실습을 진행하기에 앞서 디버거에 대한 설명을 정리해보자. 1. 디버거 설명 1) 용어 debugger - 디버깅 프로그램 (단순 ollyDbg, x64dbg 등의 프로그램 이외에도 사용자 제작 프로그램 포괄하는 개념) debuggee - 디버깅 당하는 프로그램 2) 기능 debugger는 debuggee가 올바르게 실행되는지 확인하고 프로그램의 오류를 발견하는 기능을 한다. 또한 debuggee의 명령어..
-
[리버싱 핵심원리 study] 29장 API 후킹 : 리버싱의 '꽃'Reverse Engineering 2021. 1. 18. 11:51
1. API 후킹 Win32 API를 후킹 하는 기술을 API 후킹이라고 한다. API(Application Programming Interface)란 사용자 애플리케이션이 시스템 커널에 대한 접근을 요청할 때 사용되는 것으로, Windows에서는 MS에서 Win32 API라는 것을 제공하고 있다. API 후킹을 통해서 Win32 API 호출을 중간에서 가로채 제어권을 얻어낼 수 있는데, 도식화하면 아래와 같은 구조를 갖는다. 위와 같이 CreateFile() API를 후킹 한 경우 호출될 때마다 중간에 있는 hook.dll의 MyCreateFile()이 호출된다. 2. 태크 맵 책에서는 아래와 같이 API 후킹에 대한 기술적 범주를 테크 맵으로 나타내고 있다. (32bit 기준) Method Objec..
-
[리버싱 핵심원리 study] 28장 어셈블리 언어를 이용한 Code 인젝션Reverse Engineering 2021. 1. 15. 23:03
이번 실습에서는 28장의 Code injection과 동일하지만 ThreadProc() 함수를 어셈블리 언어로 작성하여 code 인젝션을 구현한다. 1. OllyDbg로 코드 작성 OllyDbg로 예제 파일인 asmtest.exe를 열고 401000 주소에 다음과 같이 New origin here 항목을 이용하여 EIP를 401000으로 변경해보자. 이제 여기다 ThreadProc() 함수를 작성해볼 것이다. (asmtest.exe는 단순히 OllyDbg를 이용하여 어셈블리 코드를 작성하기 위한 아무 의미 없는 프로그램으로 보면 된다.) 아래와 같이 작성해보자. 이제 문자열을 입력하기 위해 dump 창의 00401033(함수가 끝난 다음 주소)에 아래와 같이 "ReverseCore:를 입력해주자. (이때..
-
[리버싱 핵심원리 study] 27장 Code 인젝션Reverse Engineering 2021. 1. 14. 23:51
1. Code Injection Code 인젝션이란 상대방 프로세스에 독립 실행 코드를 삽입한 후 실행하는 기법이다. CreateRemoteThread() API를 이용하며 Thread 인젝션이라고 불리기도 한다. 대상 프로세스에 코드와 데이터를 삽입 하주는데 앞서 다뤘던 DLL 인젝션과 비교했을 때 다음과 같은 특징이 있다. (1) 메모리를 조금만 차지한다. (2) 흔적을 찾기 어렵다. (3) 별도의 DLL 파일이 필요 없다. (Injection하는 프로그램만 있으면 됨) Code 인젝션은 규모가 작고 간단한 일을 수행할 때 용이하다. 2. 실습 예제 실습에서는 notepad.exe 프로세스를 실행시킨 후, Process Explorer를 통해 notepad.exe의 프로세스 ID를 알아낸다. 알아낸 ..
-
[리버싱 핵심원리 study] 25장 PE 패치를 이용한 DLL 로딩Reverse Engineering 2021. 1. 10. 19:50
이전 실습까지는 DLL을 실행 중인 프로세스에 인젝션 하는 방법에 대해 알아보았다. 이번 실습에서는 프로세스가 메모리에 로딩되기 이전 상태인 파일 자체를 수정하여 프로세스가 실행될 때마다 원하는 DLL을 로딩하도록 하는 실습을 진행한다. 예제 파일인 TextView.exe를 패치하여 myhack3.dll이 프로그램 실행시마다 로딩될 수 있도록 수정해보자. 1. 소스코드 (myhack3.dll) 더보기 #include "stdio.h" #include "Windows.h" #include "shlobj.h" #include "Wininet.h" #include "tchar.h" #pragma comment(lib, "Wininet.lib") #define DEF_BUF_SIZE (4096) #define ..