리버싱 5

UPack PE 헤더 상세 분석

UPack으로 실행 압축 된 notepad.exe를 PEView로 확인해 보니, IMAGE_OPTIONAL_HEADER와 IMAGE_SECTION_HEADER등의 PE 구조를 제대로 인식하지 못한다. 또한 DOS Header 영역에 Import하는 DLL 파일이 보이고, DOS Stub이 보이지 않는 등 원본의 notepad.exe와는 다른 모습을 보인다. 이렇듯 PEView로 분석하는 데 어려움이 있으니 Stud_PE로 분석하자. e_magic이 4A5D, e_lfanew는 10이다. 즉, DOS Header에 NT Header를 겹쳐서 썼다는 것이다. 그러므로 offset 10에 NT Header의 시작인 Signature 값이 보인다. 여기서 주목해야 할 요소는 SizeOfOptionalHeader..

리버싱 2021.11.08

PE File Format

PE파일이란? PE(Portable Executable)파일은 Windows 운영체제에서 사용되는 실행 파일 형식이다. PE 파일은 32비트 형태의 실행 파일을 의미하고, PE32라고도 한다. 64비트 형태의 실행 파일은 PE+ 또는 PE32+라고 한다. PE파일의 종류 종류 주요 확장자 종류 주요 확장자 실행 계열 EXE, SCR 드라이버 계열 SYS, VXD 라이브러리 계열 DLL, OCX, CPL, DRV 오브젝트 파일 계열 OBJ OBJ 파일을 제외한 모든 종류의 파일은 실행이 가능하나, DLL과 SYS 파일은 셸에서 직접 실행하는 것이 불가능하고 디버거 등을 통해 실행이 가능하다. 기본 구조 DOS header부터 Section Header까지를 PE헤더, 그 밑의 Section들을 PE 바디라..

리버싱 2021.09.07

DLL 인젝션

DLL 인젝션 ⦁ DLL 인젝션 실행 중인 다른 프로세스에 특정 DLL 파일을 강제로 삽입하는 것 즉, LoadLibrary() API를 해당 프로세스가 스스로 호출하여 사용자가 원하는 DLL을 로딩하는 것이다. 로딩된 DLL은 해당 프로세스의 메모리에 대한 정당한 접근 권한을 갖는다. ⦁ DLL 인젝션 활용 LoadLibrary 함수를 호출하도록 만드는 것이므로 삽입된 DLL의 DllMain() 함수가 실행된다. 그러므로 기능을 추가하거나 버그를 패치하는 작업을 코드로 작성하는 것이 가능하다. 이러한 원리로 메시지 후킹, API 후킹, PC 사용 모니터링 프로그램, 악성코드에서 많이 사용하는 기법이다. ⦁ DLL 인젝션 구현 방법 원격 스레드 생성(CreateRemoteThread() API) 레지스트..

리버싱 2021.08.30

UPack 디버깅 - OEP 찾기

OllyDbg 실행 에러 UPack은 IMAGE_OPTIONAL_HEADER에서 NumberOfRvaAndSizes 값을 A로 변경하므로 올리디버거의 초기 검증 과정에서 아래와 같은 에러 메시지가 발생한다. 디코딩 루프 모든 패커에는 디코딩 루프가 존재하는데, 이를 디버깅할 때는 조건 분기를 적절히 건너뛰어서 루프를 탈출해야 한다. 레지스터를 잘 보면서 어떤 주소에 값을 쓰고 있는지 살펴봐야 한다. UPack은 두 번째 섹션에 압축된 원본 데이터가 존재하고 이는 디코딩 루프를 돌면서 첫 번째 섹션에 압축이 해제된다. EP에서부터 디버깅을 하자. 처음 두 명령은 010011B0에서 4바이트를 읽어 EAX에 저장하는 명령이다. LODS DWORD PTR DS:[ESI]는 ESI가 가리키는 주소에서 4바이트 ..

리버싱 2021.08.06

UPack PE 헤더 분석

UPack에서 사용되는 PE 헤더 구조 ⦁ 헤더 겹쳐쓰기 MZ 헤더(IMAGE_DOS_HEADER)와 PE 헤더(IMAGE_NT_HEADERS)를 겹쳐 써 헤더 공간을 절약하고, 분석을 어렵게 만든다. e_lfanew값에 따라서 IMAGE_NT_HEADERS의 시작점이 결정되는데, 보통 프로그램의 e_lfanew의 값은 아래와 같은데, UPack 에서는 이 값이 10이다. e_lfanew = MZ 헤더 크기(40) + DOS Stub 크기(가변 : VC++의 경우 보통 A0) = E0 ⦁ IMAGE_FILE_HEADER.SizeOfOptionalHeader 그러므로 00000010으로 이동하게되고 이 곳에서 IMAGE_FILE_HEADER.SizeOfOptionalHeader의 값을 조작하여 IMAGE_..

리버싱 2021.08.01