목록Ethical Hacking/Reversing (16)
KoreanFoodie's Study
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. 실행 압축되거나 암호화된 파일을 패치할 때 자주 사용되는 인라인 패치(Inline Patch) 기법을 실습해 보자. 인라인 패치 인라인 코드 패치(Inline Code Patch) 혹은 줄여서 인라인 패치(Inline Patch)라고 하는 기법은 원하는 코드를 직접 수정하기 어려울 때 간단히 코드 케이브(Code Cave)라고 하는 패치 코드를 삽입한 후 실행해 프로그램을 패치시키는 기법이다. 주로 대상 프로그램이 실행 압축(혹은 암호화)되어 있어서 파일을 직접 수정하기 어려운 경우 많이 사용하는 기법이다. 위 그림처럼 전형적인 실행 압축(또는 암호화) 코드가 있다고 해 보자. EP(Entry Point)코드는 암호화된 OEP(Original ..
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. UPack 패커를 이용하여 압축한 notepad.exe 파일의 EP(Entry Point)를 찾아 디버깅 해보자. OllyDbg 디버깅 에러 Stud_PE를 이용하여 EP의 VA를 알아낼 수 있다. RVA 값이 1018이고 ImageBase가 01000000이므로, 01001018이 실제 EP의 주소값이라는 것을 알 수 있다. 이제 OllyDbg를 실행하여 01001018 주소를 EP로 설정하면 된다! 디코딩 루프 EP부터 차근차근 디코딩을 해 보자. 처음 두 명령은 010011B0 주소에서 4 바이트를 읽어 EAX에 저장하는 명령이다. EAX는 0100739D 값을 가지는데, 이는 원본 notepad의 OEP(Original Entry Poi..
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. UPack 패커를 이용한 notepad.exe의 PE 헤더 구조를 파헤쳐 보자. 준비물 UPack Stud_PE notepad.exe (32bit ver.) UPack의 PE 헤더 분석 헤더 겹쳐쓰기 이는 다른 패커에서도 많이 쓰이는 기법이다. 이는 MZ 헤더(IMAGE_DOS_HEADER)와 PE 헤더(IMAGE_NT_HEADERS)를 교묘하게 겹쳐쓰는 것이다. 헤더를 겹쳐씀으로 해서 헤더 공간을 절약할 수 있다. 부가적으로 복잡성을 증가시켜 분석을 어렵게 만드는 효과도 있다. Stud_PE를 이용해서 MZ 헤더를 살펴보자. ('Headers' 탭의 [Basic HEADERS tree view in hexeditor] 버튼) MZ 헤더(IMA..
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. PE 파일에서 .reloc 섹션을 수동으로 제거하는 실습을 해 보자. .reloc 섹션 EXE 형식의 PE 파일에서 Base Reloaction Table 항목은 실행에 큰 영향을 끼치지 않는다(DLL, SYS 형식의 파일은 거의 필수!). VC++ 에서 생성된 PE 파일의 Relocation 섹션 이름은 '.reloc'이다. .reloc 섹션이 제거되면 PE 파일의 크기가 약간 줄어드는 효과가 있다. 이때, .reloc 섹션은 보통 마지막에 위치한다. reloc.exe '.reloc' 섹션 제거는 아래의 4 단계의 작업을 통해 이루어진다. .reloc 섹션 헤더 정리 .reloc 섹션 제거 IMAGE_FILE_HEADER 수정 IMAGE_OP..
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. PE 파일의 재배치(Relocation)과정에 사용되는 Base Relocation Table의 구조와 동작 원리에 대해서 알아보자. PE 재배치 PE 파일(EXE/DLL/SYS)이 프로세스 가상 메모리에 로딩될때 PE헤더의 ImageBase 주소에 로딩된다. DLL(SYS)파일의 경우 ImageBase 위치에 이미 다른 DLL(SYS) 파일이 로딩되어 있다면 다른 비어 있는 주소 공간에 로딩된다. 이것을 PE 파일 재배치라고 한다. 즉 PE 재배치란 PE 파일이 ImageBase에 로딩되지 못하고 다른 주소에 로딩될 때 수행되는 일련의 작업들을 의미한다. SDK(Software Development Kit) 또는 Visual C++로 PE 파..
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. 해당 챕터는 UPX를 이용해 notepad.exe를 압축한 후, 원본 EP (OEP; Original Entry Point)를 찾는 것이 핵심이다. 꼭 다시 실습 해볼 것! UPX 패커의 특징 몇 가지를 알아보자. UPX 패커는 PUSHAD 명령으로 EAX ~ EDI 레지스터 값을 스택에 저장하고, ESI와 EDI 레지스터를 각각 두 번째 섹션 시작 주소(010110000)와 첫 번째 섹션 시작 주소(01001000)로 세팅한다. 디버깅할 때 이처럼 ESI와 EDI가 동시에 세팅되면 ESI가 가리키는 버퍼에서 EDI가 가리키는 버퍼로 메모리 복사가 일어날 거라고 예측할 수 있다. 트레이스(Trace)란 코드를 하나하나 실행하면서 쫓아가는 것을 ..
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. 실행 압축이란 말 그대로 실행(PE: Portable Executable)파일을 대상으로 파일 내부에 압축해제 코드를 포함하고 있어서 실행되는 순간에 메모리에서 압축을 해제시킨 수 실행시키는 기술이다. 실행 압축된 파일 역시 PE 파일이며, 내부에 원본 PE 파일과 decoding 루틴이 존재한다. EP(Entry Point) 코드에 decoding 루틴이 실행되면서 메모리에서 압축을 해제시킨 후 실행된다. 일반적인 ZIP 압축과 실행 압축의 차이 항목 | 일반 압축 | 실행 압축 |:-----|:--------|:------| 대상 파일 | 모든 파일 | PE 파일(exe, dll, sys) 압축 결과물 | 압축(zip, rar) 파일 | P..
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. PE(Portable Executable) 파일은 Windows 운영체제에서 사용되는 실행 파일 형식이다. 기존 UNIX에서 사용되는 COFF(Common Object File Format)를 기반으로 Microsoft에서 만들었다. 애초에는 다른 운영체제에 이식성을 좋게 하려고 만들었으나 현재는 Windows 계열의 OS에서만 사용되고 있다. PE File Format 본격적으로 PE 파일의 종류를 알아보자. 종류 | 주요 확장자 |:-----|:------| 실행 계열 | EXE, SCR 라이브러리 계열 | DLL, OCX, CPL, DRV 드라이버 계열 | SYS, VXD 오브젝트 파일 계열 | OBJ 엄밀히 얘기하면 OBJ(오브젝트) 파..
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. 함수 호출 규약 챕터 10은 함수 호출 규약(Calling Convention)에 대해 다룬다. 이는 '함수를 호출할 때 파라미터를 어떤 식으로 전달하는지'에 대한 일종의 약속이다. 함수 호출 규약은 cdecl, stdcall, fastcall으로 크게 3 가지로 나뉜다. 간단한 용어 설명 Caller(호출자) - 함수를 호출한 쪽 Callee(피호출자) - 호출을 당한 함수 cdecl 방식 cdecl방식은 주로 C 언어에서 사용되는 방식이며, Caller에서 스택을 정리하는 특징을 가지고 있다. #include "studio.h" int add(int a, int b) { return (a + b); } int main (int argc, c..
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. 챕터 8은 두 번째 crackme를 다룬다. (abex' 2nd crackme) VB 파일은 MSVBVM60.dll(Microsoft Visual Basic Virtual Machine 6.0) 이라는 VB 전용 엔진을 사용한다. (The Thunder Runtime Engine 이라는 이름으로도 불리고 있음) VB 엔진의 사용 예를 보자. 메시지 박스를 출력하고 싶을 때, VB 소스코드에서 MsgBox() 함수를 사용한다. VB 컴파일러는 실제로 MSVBVM60.dll!rtc MsgBox() 함수가 호출되도록 만들고, 이 함수 내부에서 Win32 API인 user32.dll!MessageBox() 함수를 호출해주는 방식으로 동작한다. (VB ..