리버싱 핵심원리 15장
Security/Reversing
15장 UPX 실행 압축된 notepad 디버깅 실행 압축 파일들의 디버깅은 많은 루프의 연속이며 어떠한 루프를 하는지 UPX로 패킹된 notepad로 알아볼 예정 (*ESI와 EDI가 동시에 세팅되면 ESI가 가르키는 버퍼에서 EDI가 가르키는 버퍼로 메모리 복사가 일어날 것이라고 예측할 수 있다. 압축 해제의 경우에는 ESI로부터 데이터를 읽어서 압축을 해제한 후 EDI에 저장하는 것.) 루프1 EDX에서 한 바이트를 읽어 EDI에 쓰는 것. EDX 레지스터가 가리키는 01001000 주소는 첫 번째 섹션(UPX0)의 시작 주소이며, 메모리에서만 존재하는 섹션이다. 루프2 본격적인 디코딩 루프(압축해제 루프)이다. ESI가 가리키는 두 번째 섹션(UPX1)의 주소에서 차례대로 값을 읽어서 적절한 연산..
리버싱 핵심원리 14장
Security/Reversing
14장 실행 압축 데이터 압축 어떤 형태의 파일(또는 데이터)이라도 내부는 바이너리로 되어있기 때문에 적절한 압축 알고리즘을 사용하여 크기를 줄일 수 있다. 비손실 압축 압축된 파일을 100%원래대로 복원할 수 있는 압축을 비손실 압축이라고 한다. 파일(데이터)의 크기를 줄여서 보관 및 이동에 용이하도록 하려는 목적으로 사용됨. 파일을 사용할 땐 해당 압축을 해제해서 사용한다.(이 과정에서 데이터의 무결성이 보장되어야함) 반디집과 같은 압축 프로그램을 이용해서 파일을 압축시키는 경우가 비손실 압축에 해당됨. 대표적인 비손실 압축 알고리즘은 Run-Length, Lempel-Ziv, Huffman 등이 있다. 대표적인 압축 파일 포맷인 .ZIP, .RAR 등도 근본적인 압축 개념은 결국 Run-Length..
리버싱 핵심원리 13장(2)
Security/Reversing
13장(2) PE헤더의 핵심 IAT(Import Address Table), EAT(Export Address Table) IAT(Import Address Table)에는 Windows 운영체제의 핵심 개념인 process, memory, DLL 구조 등에 대한 내용이 함축되어있음. IAT란 쉽게 말해 프로그램이 어떤 라이브러리에서 어떤 함수를 사용하고 있는지를 기술한 테이블이다. IAT(Import Address Table) 1. DLL(Dynamic Linked Library) DLL 로딩 방식 프로그램에서 사용되는 순간에 로딩하고 사용이 끝나면 메모리에서 해제하는 방법(Explicit Linking) 프로그램 시작과 함께 로딩되어 프로그램이 종료될 때 메모리에서 해제하는 방법(Implicit Li..
리버싱 핵심원리 13장(1)
Security/Reversing
13장(1) PE File Format PE(Portable Executable) 파일은 Windows 운영체제에서 사용되는 실행 파일 형식이다. 기존 UNIX에서 사용되는 COFF(Common Object File Format)를 기반으로 MS에서 만듦. 애초에는 이름마냥 다른 운영체제에 이식성을 좋게 하려는 의도였으나 실제로는 Windows 계열의 운영체제에서만 사용되고 있음. PE파일은 32비트 형태의 실행 파일을 의미하며 PE32라는 용어를 사용하기도 한다. 64비트 형태의 실행파일은 PE+ 또는 PE32+라고 부르며 PE파일의 확장 형태이다. PE File Format 실행계열 : EXE, SCR 라이브러리 계열 : DLL, OCX, CPL, DRV 드라이버 계열 : SYS, VXD 오브젝트 파..
리버싱 핵심원리 8장
Security/Reversing
8장 abex'crackme #2 Visual Basic으로 제작된 abex'crackme를 크랙해보자. VB파일은 MSVBVM60.dll이라는 VB전용 엔진을 사용함.(The Thunder Runtime Engine이라고 불리기도 함) VB엔진의 사용 예시로는 메세지 박스를 출력하고 싶을 때 VB소스코드에서 MsgBox()함수를 사용하는데 VB컴파일러는 실제로 MSVBVM60.dll!rtcMsgBox() 함수가 호출되도록 만들고, 이 함수 내부에서 Win32 API인 MessageBoxW()함수를 호출해주는 방식으로 동작함.
리버싱 핵심원리 7장
Security/Reversing
7장 스택 프레임(Stack Frame) 스택 프레임이란 ESP(스택 포인터)가 아닌 EBP(베이스 포인터)레지스터를 사용하여 스택 내의 로컬 변수, 파라미터(매개변수), 복귀 주소에 접근하는 기법을 말함. ESP 레지스터의 값은 프로그램 안에서 수시로 변경되기 때문에 스택에 저장된 변수, 매개변수에 접근하고자 할 때 ESP값을 기준으로 하면 프로그램을 만들기 힘들고, cpu가 정확한 위치를 참고할 때 어려움이 있다. 따라서 어떤 기준 시점(함수의 시작)의 ESP값을 EBP에 저장하고 이를 함수 내에서 유지해주면 ESP값이 변경되어도 EBP를 기준으로 안전하게 해당 함수의 변수, 파라미터, 복귀 주소에 접근할 수 있다. 이것이 바로 EBP 레지스터의 역할. 함수가 시작(call)할 때 ESP는 함수의 실..
리버싱 핵심원리 6장
Security/Reversing
6장 abex'crackme #1 분석 간단한 crackme 샘플을 분석하여 실습하기. 단순히 크랙이 목표가 아니라 디스어셈 코드와 디버깅에 익숙해지기. abexcrackme를 디버거로 키면 코드가 앞에서 했던 HelloWorld와는 다르게 매우 짧은데 이것은 어셈블리언어로 만들어진 실행파일이기 때문임. VC++, VC, Delphi등 개발툴을 사용하면 자신이 작성한 소스코드 외에 컴파일러가 stub code를 추가시키기 때문에 디스어셈을 하면 복잡하게 보임. 하지만 어셈블리 언어로 소스코드를 작성하면 어셈 코드가 곧 디스어셈 코드가 되기 때문에 굉장히 직관적인 코드(EP에 main함수가 바로 나타남)가 됨. 코드를 살펴보면 MessageBoxA와 GetDriveTypeA가 먼저 보인다. 메세지를 출력하..
리버싱 핵심원리 5장
Security/Reversing
5장 스택 스택의 역할 1. 함수 내의 로컬 변수 임시 저장 2. 함수 호출 시 파라미터(매개변수) 전달 3. 복귀 주소(return address) 저장 이러한 역할을 수행하기 위해서 스택의 FILO(First In Last Out)구조가 아주 유용함. 스택의 특징 프로세스에서 스택포인터(ESP)의 초기값은 Stack Bottom(아래)에 가깝게 위치되어있는데 push명령에 의해 스택에 값이 추가되면 스택포인터는 Stack Top(위)을 향해 움직이고 pop으로 값이 제거되면 ESP는 다시 Stack Bottom을 향해 움직임. 즉 높은 주소에서 낮은 주소 방향으로 스택이 자라남. 즉 높은 주소에서 낮은 주소 방향으로 스택이 자라남. 우측 하단의 스택창에서 가장 위에 있는 값이 ESP값인데 우측 상단에..