본문 바로가기

분류 전체보기

(35)
[리버싱 핵심원리] 29장 - API 후킹 : 리버싱의 '꽃' 1. 후킹 리버싱에서 후킹은 정보를 가로채고, 실행 흐름을 변경하고, 원래와는 다른 기능을 제공하는 기술을 말한다. 후킹의 프로세스는 다음과 같다. - 디스어셈블러 / 디버거를 이용하여 프로그램읙 구조와 동작 원리를 파악 - 버거 수정 또는 기능 개선에 필요한 훅(Hook) 코드를 개발 - 실행 파일과 프로세스 메모리를 자유롭게 조작하여 훅 코드 설치 프로그램 소스가 있다면 대부분의경우 후킹은 필요하지 않지만, 소스코드가 없거나 소스코드의 수정이 여의지 않은 특수한 상황에서는 후킹 기술이 요긴하게 사용된다. 여러 가지 후킹 기술이 있지만, 그 중에섣 Win32 API를 후킹하는 기술을 API 후킹이라고 한다. (User mode 후킹 중에서 메시지 후킹과함께 가장 널리 사용되는 기술이다.) 2. API ..
[리버싱 핵심원리] 28장 - 어셈블리 언어를 이용한 Code 인젝션 어셈블리 언어는 C언어보다 더 자유로운 (정형화되지 않은) 코드를 생성할 수 있다. OllyDbg의 Assemble 기능을 이용해 어셈블리 언어로 인젝션할 코드를 만들어 본다. 28.1 OllyDbg의 Assemble 명령 코드 인젝션할 실행파일을 OllyDbg로 실행시킨다. Assemble 기능은 명령어 수정(혹은 추가)를 원하는 부분에서 스페이스 바를 누르면 된다. (이때, Fill with NOP's 항목은 기존의 코드보다 짧은 길이의 코드를 입력했을 때 남은 부분은 NOP로 채워 Code Alignment를 맞추는 것이다.) (+ EIP를 원하는 주소로 바꾸는 기능 : New origin here ==> 단순히 EIP만 변경시키는 것으로, 레지스터와 스택의 내용은 전혀 바뀌지 않아서 직접 디버깅을..
[리버싱 핵심원리] 27장 - Code 인젝션 27.1 Code 인젝션 상대방 프로세스에 독립 실행 코드를 삽입한 후 실행하는 기법으로, CreateRemoteThread() API를 일반적으로 이용해 원격 스레드 형태로 실행해 Thread 인젝션이라고도 한다. 해당 방식은 인젝션 대상이 되는 프로세스에 코드와 데이터를 삽입한다. 이때 코드는 Thread Procedure 형식으로, 코드에서 사용되는 데이터는 스레드의 마라미터로 전달하면 된다. ==> 코드와 데이터를 인젝션 해준다! 1. Code 인젝션 vs DLL 인젝션 DLL 인젝션은 인젝션을 위한 코드를 DLL 파일로 변형해 다른 프로세스에 인젝션하면 된다. 그리고 DLL의 코드에서 사용되는 모든 데이터는 DLL의 데이터 영역에 위치한다. 따라서 DLL 인젝션 기법은 코드와 데이터가 같이 메모..
[리버싱 핵심원리] 25장 - PE 패치를 이용한 DLL 로딩 대상 프로그램의 실행 파일을 직접 수정하여 DLL을 강제로 로딩하는 방법에 대해 알아본다. 해당 방법은 한 번 적용해 놓으면 별도의 인젝션 과정 없이 프로세스가 시작할 때마다 원하는 DLL을 로딩하게 만들 수 있다. (일종의 크랙이다.) 25.1 실습 파일 실습 목표 : TextView.exe 파일을 직접 수정해 실행 시 myhack3.dll을 로딩하도록 만드는 것 1. TextView.exe TextView.exe에서 직접 임포트하는 DLL 파일들을 볼 수 있다. 2. TextView_patch.exe TextView.exe의 IDT에서 myhack3.dll이 추가된 모습을 볼 수 있다. TextView_patch.exe는 실행 시에 myhack3.dll 파일을 로딩한다. 파일을 실행시키면 아래와 같은..
[리버싱 핵심원리] 13장 - PE File Format(2) 13.4 RVA to RAW PE 파일이 메모리에 로딩되었을 때 각 섹션에서 메모리의 주소(RVA)와 파일 옵셋을 매핑하는 것을 일반적으로 'RVA to RAW'라고 부른다. 해당 변환의 과정은 다음과 같다. 1. RVA(메모리에 로딩된 주소)가 속해 있는 섹션을 찾는다. 2. 간단한 비례식을 사용해서 RAW(파일 옵셋)을 계산한다. IMAGE_SECTION_HEADER 구조체에 의하면 비례식은 아래와 같다. RAW - PointerToRawData(파일에서 해당 섹션의 시작주소) = RVA - VirtualAddress (메모리에 해당 섹션의 시작 주소) RAW = RVA - VirtualAddress + PointerToRawData ex) RVA = 5000일 때 File offset? 1. 해당 ..
[리버싱 핵심원리] 13장 - PE File Format(1) 13.1 소개 PE(Portable Executable) 파일은 Windows 운영체제에서 사용되는 실행 파일 형식이다. PE 파일은 애초에 다른 운영체제에 이식성을 좋게 하려는 의도로 만들어졌지만, 실제로는 Windows 계열의 운영체제에서만 사용되고 있다.. PE 파일은 32비트 형태의 파일을 의미하며, 64비트 형태의 파일은 PE32+(혹은 PE+) 라고 부르며 PE 파일의 확장 형태이다. 13.2 PE File Format 종류 주요 확장자 종류 주요 확장자 실행 계열 EXE, SCR 드라이버 계열 SYS, VXD 라이브러리 계열 DLL, OCX, CPL, DRV 오브젝트 파일 계열 OBJ 엄밀히 얘기하면 오브젝트 파일을 제외한 모든 것은 실행 가능한 파일이다. (DLL, SYS 파일 등은 셸에서..
[리버싱 핵심원리] 24장 - DLL 이젝션 24.1 DLL 이젝션 동작원리 DLL 인젝션과 DLL 이젝션은 서로 반대되는 개념이다. DLL 인젝션은 대상 프로세스로 하여금 LoadLibrary() API를 호출하도록 만드는 것이었다면, DLL 이젝션은 대상 프로세스로 하여금 FreeLibrary() API를 호출하도록 만드는 것이다. 즉, CreateRemoteThread()의 IpStartAddress 파라미터에 FreeLibrary() API 주소를 넘겨주고, IpParameter 파라미터에 이젝션할 DLL의 HANDLE을 넘겨주는 것이다. 24.2 DLL 이젝션 구현 (EjectDll 소스코드에서 핵심 함수인 EjectDll의 코드) BOOL EjectDll(DWORD dwPID, LPCTSTR szDllName) { BOOL bMore =..
[리버싱 핵심원리] 23장 - DLL 인젝션 23.1 DLL 인젝션 DLL 인젝션이란 다른 프로세스에게 LoadLibrary() API를 스스로 호출하도록 명령하여 사용자가 원하는 DLL을 로딩하는 것이다. 정리하자면, 실행 중인 다른 프로세스에 특정 DLL 파일을 강제로 삽입하는 것을 말한다. DLL 인젝션과 일반적인 DLL 로딩의 차이점은 로딩 대상이다. DLL 인젝셕은 다른 프로세스가 로딩 대상이고 일반적인 DLL 로딩의 대상은 자신이기 때문이다. (DLL 인젝션은 원래는 자기를 로딩하지 않는 프로세스에 강제로 들어간다는 거!) 일반적으로 프로세스에 로딩된 dll 파일은 해당 프로세스 메모리에 대한 정당한 접근 권한을 가진다. 따라서 인젝션 된 dll 파일 또한 해당 프로세스에 대한 메모리 접근 권한을 가지게 된다. +) 프로세스에 DLL이 ..