목록Categories (1099)
KoreanFoodie's Study
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. 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 ..
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. 스택 프로세스에서 스택 메모리의 역할은 아래와 같다. A. 함수 내의 로컬 변수 임시 저장 B. 함수 호출 시 파라미터 전달 C. 복귀 주소(return address)저장 프로세스에서 스택 포인터(ESP)의 초기 값은 Stack Bottom쪽(그림 아래쪽)에 가깝다. PUSH 명령으로 스택에 값을 입력하면 스택 포인터(ESP)는 감소하고, POP 명령으로 스택에서 값을 꺼내면 스택포인터는 증가한다. 즉, 스택은 거꾸로 자란다! POP EBP 를 하면 EBP 값이 변하는데, PUSH 의 경우에는 PUSH EBP 명령어를 실행해도, 현재의 EBP 값(예: 0019FF38) 값만 메모리에 저장되지 EBP 자체의 값은 바뀌지 않는다. POP EBP ..
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. 1. CPU 레지스터란? 레지스터(Register)란 CPU 내부에 존재하는 다목적 저장 공간이다. 우리가 일반적으로 메모리라고 얘기하는 RAM(Random Access Memory)과는 조금 성격이 다르다. CPU가 RAM에 있는 데이터를 엑세스(Access)하기 위해서는 물리적으로 먼 길을 돌아가야 하기 때문에 시간이 오래 걸린다. 하지만 레지스터는 CPU와 한 몸이기 때문에 고속으로 데이터를 처리할 수 있다. 레지스터의 종류 Basic program execution registers x87 FPU registers MMX registers XMM registers Control registers Memory management regis..
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. 바이트 오더링 : 바이트 오더링은 데이터를 저장하는 방식이라고 기억하면 된다. 크게 두 가지로, 빅 엔디언(Big Endian)과 리틀 엔디언(Little Endian)방식이 있다! TYPE | Name | SIZE | 데이터 | 빅 엔디언 Style | 리틀 엔디언 Style |:----|:----|:----|:----|:----|:-----| BYTE | b | 1 | 0x12; | [12] | [12] WORD | w | 2 | 0x1234; | [12][34] | [34][12] DWORD | dw | 4 | 0x12345678 | [12][34][56][78] | [78][56][34][12] char [] | str | 6 | "ab..
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. 1. EP(Entry Point) EP(Entry Point)란 Windows 실행 파일 (EXE, DLL, SYS등)의 코드 시작점을 의미한다. 프로그램이 실행될 때 CPU에 의해 가장 먼저 실행되는 코드 시작 위차라고 생각하면 된다. 2. 디버거 명령어 명령어 |단축키 |설명 |:------|:-------|:------| Go to | [Ctrl+G] | 원하는 주소로 이동(코드/메모리를 확인할 때 사용. 실행되는 것은 아님) Execute till Cursor | [F4] | cursor 위치까지 실행 (디버깅하고 싶은 주소까지 바로 갈 수 있음) Set/Reset Breakpoint | [F2] | BP 설정 / 해제 Run | [F9..