한국어

tc_backup

# Unpacking에 사용된 파일은 심플스(http://simples.co.kr)의 unpackme 파일임을 밝혀둡니다.
# 그림이 잘 보이지 않을 경우, 클릭하여 보시면 원래의 사이즈로 볼 수 있습니다.


PEiD라는 PE Header 분석 프로그램을 이용하여 확인하여 보면 UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo [Overlay] 라는 Packing 정보를 확인할 수 있습니다. 한가지 참고할 점은 분석 프로그램을 전적으로 신뢰하지 않는 것이 좋습니다. 시그너쳐를 조작하게 되면 잘못된 정보를 나타내기도 하며, 그럴 경우에 분석을 오히려 더 어렵게 할 수 있습니다.

UPX의 경우 압축을 목적으로 하는 Packer이며 Unpacker가 존재하며 http://upx.sourceforge.net 에서 받을 수 있습니다.


위 그림은 대상 프로그램을 처음 불러왔을 때의 모습입니다.

PUSHAD
PUSHAD는 모든 Register를 Stack에 PUSH하는 명령어입니다. 오른쪽 아래의 Stack Window를 자세히 살펴 보면 알 수 있습니다.

PUSHAD를 Step into(F7)나 Step over(F8)를 이용하여 실행한 다음 Stack Window에서는 Breakpoint를 걸 수 없기 때문에 Dump Window를 통해 Stack을 보게 한 다음 Stack의 가장 위에 Breakpoint를 겁니다. ESP에서 Follow in Dump를 하면 간단하게 이동이 가능합니다. Dword가 4Byte를 뜻하며, 메모리 주소값은 4Byte로 표현이 됩니다.

Breakpoint를 걸었으면 Run(F9)하여 진행을 하여 보면 아래 위치에서 Break가 걸리게 됩니다.


POPAD
Stack에 백업되었던 모든 Register의 값들을 원래대로 Register에 복구 시킵니다.

POPAD 명령을 수행 한 다음에 Register는 원래대로 복구가 됩니다. 복구가 되는 과정에서 ESP의 위치를 Access를 하게 되는데 이때 Break가 걸리게 됩니다. POPAD를 조금 더 내려가면 JMP가 보이게 되는데 그 곳이 JMP를 하게 되면 OEP로 진입을 하게 됩니다. 그러나 Highlight된 부분의 Stolen Byte가 문제가 됩니다.
OEP로 진입한 다음 Dump를 하게 되면 위의 내용이 손실되게 됩니다. 위의 내용은 실제 소스에서 사용되는 매개변수인데, 매개변수가 손실되게 되면 함수를 호출시에 문제가 발생하게 됩니다.

StolenByte
Stolen Bytes는 패커가 위치를 이동시킨 코드로써 보호된 프로그램의 코드의 윗부분(보통은 엔트리 포인트의 몇 개의 명령어)입니다. 이 부분의 명령어는 이동된 곳 이나 할당 받은 메모리 공간에서 실행됩니다.
보호된 프로세스의 메모리가 덤프 되었을 때 Stolen Bytes 를 복구 하지 못한다면 덤프된 실행파일은 작동하지 않습니다.

6A 00
68 00204000
68 12204000

라는 Stolen Byte를 메모장에 열어서 복사하고 OEP로 진입합니다.


OEP로 진입하게 되면 위와 같은 내용이 나옵니다. 여기서 Dump를 하여야 하는데 좀 전의 Stolen Byte는 다른 영역(Packer의 영역)에 존재하므로 OEP를 100C(400000은 ImageBase이므로 생략)로 하여 Dump를 하게 되면 조금 전의 Stolen Byte로 되어진 MessageBoxA 함수의 매개변수가 손실되게 됩니다.

다행히 100C의 위에는 NOP Code로 비어진 공간이 존재하여 해당 영역에 Ctrl + E 키를 사용하거나 Binary Edit로 복사하여 놓은 Stolen Byte를 삽입합니다.


예제로 된 파일이라 NOP Code로 된 사이즈는 알맞게 Stolen Byte를 삽입하게 되어 있습니다.
그러나 실제 Solen Byte가 예제처럼 딱 맞는 경우가 항상이라고 생각하시면 안됩니다. 때에 따라서는 삽입할 수 있는 공간이 넉넉할 수 있지만, 그렇지 못할 경우에는 다른 남는 NOP Code가 존재하는 공간을 찾아 삽입하고 JMP 명령어를 사용하여 원래 실행되어야 하는 OEP로 오게 하여야 정상적으로 프로그램이 실행이 가능해집니다. 이제 Stolen Byte를 복구하였으므로 Dump를 하여야 합니다.


OllyDump Plugin을 사용하여 Dump를 하여야 하는데, 확인하여야 하는 부분은 Highlight된 Modify와 Rebuild Import입니다.

Modify는 Dump하기 이전의 Entry Point(최초 프로그램 시작점. Packer의 영역)를 원래의 OEP(Original Entry Point)로 수정하는 것입니다. OllyDump가 자동으로 잡는 값은 현재 Break가 걸린 위치이므로 100C라고 나오게 됩니다. 그러나 Stolen Byte를 삽입하였고 그 시작점이 1000이 되었습니다.(해당 위치에 ImageBase 4000000를 더하면 됩니다) 그러므로 우리는 1000이라고 값을 입력합니다

두번째로 Rebuild Import는 IAT(Import Address Table)을 OllyDump가 자동으로 찾는 옵션이지만, 자동으로 찾는 경우가 드물기 때문에 체크해제하고 수동으로 IAT를 수정하여 주어야 합니다. 찾기 이전에 Dump를 하여 임의의 파일명으로 저장을 합니다. 저 같은 경우에는 unpackme_05.exe 파일이라는 원본 파일명 뒤에 _dump를 붙여 unpackme_05_dump.exe 파일로 저장하였습니다.

IAT를 찾는 방법은 Disassembler Window에서 Ctrl + B키를 이용하여 FF25라는 Hex 값을 Search하여 찾을 수도 있고, OEP의 주변을 직접 에서 마우스 스크롤을 통하여 찾아보는 방법도 있습니다. 특별한 방법이 존재하는 것은 개인의 역량에 따라 찾는 속도가 차이가 나게 됩니다. 분석을 많이 해본 사람은 경험을 통하여 좀 더 빨리 찾게 됩니다.


저 같은 경우는 간단한 예제 파일이기 때문에 마우스 스크롤을 통하여 IAT를 찾았고, 사용되는 함수가 Kernel32.dll의 CreateFileA, GetFileSize, ExitProcess와 USER32.dll의 MessageBoxA 라는 API 함수가 사용된 것을 확인할 수 있었습니다.
403054의 주소값이 IAT라는 것을 알았기 때문에 Dump Window에서 G to Expression(Ctrl + G키)하여 403052을 입력합니다. 그 후 보기 쉽게 하기 위하여 Dump Window에서 오른쪽 버튼을 누르고 Long -> Address를 선택하면 위의 그림처럼 나타나게 됩니다. 원래대로 돌리려면 Hex -> Hex/Ascii를 선택하시면 됩니다.

Dump Window에서 마우스 스크롤을 통하여 다른 API 함수가 사용되는지 확인하여야 하며 중간에 IAT의 끝은 00000000입니다. 그렇다고 403060이 끝은 아닙니다. 위의 그림처럼 IAT 사이사이에 NULL로 채워진 경우에는 자동화 툴을 사용하다보면 다음에 나오는 IAT(위의 그림에서는 MessageBoxA)까지 인식하지 못하는 경우가 발생할 수 있습니다. 그러므로 자동화 툴보다는 직접 확인하는 것이 좋습니다.

위의 결과로 00403054에서 00403067까지가 IAT라는 것을 알았고, 사이즈를 계산하여 보면 00403067 - 00403054 = 13이 나오게 되며 주소값의 경우엔 Hex(16진수) 값이며 10진수 값이 아닙니다.

IAT의 시작주소가 3054라는 것과 Size가 13이라는 것을 알았으므로 IAT Rebuild 툴을 사용하여 수정하여야 합니다. 아직 디버거를 종료하면 안됩니다.


ImportREC(Import REConstructor) 툴을 사용하여 아직 디버깅중인 파일을 Attach시켜주고, OEP인 1000값을 입력하고 IAT AutoSearch 버튼을 누르면 그림처럼 IAT의 RVA(Relative Virtual Address)와 Size를  자동으로 계산하여 주고 Get Imports 버튼을 누르면 해당 위치에서 찾은 API 함수와 dll 파일을 결과물로 나타내어 줍니다.

그러나 우리가 찾은 IAT의 시작 주소는 3054이고 사이즈는 13이라는 것과 차이가 있습니다.


위 그림을 통하여 다시 확인하여 보면 자동으로 찾았을때는 노란색 범위만큼을 뜻하고, 우리가 실제 찾은 사이즈는 연두색 부분만큼입니다. 실제로 필요한 사이즈는 연두색 부분이지만, 노란색 부분만큼 사용한다고 하여도 NULL로된 부분이기 때문에 프로그램 실행에는 아무 문제가 없습니다.

하지만, 자동화 툴에 사용하기 이전에 제대로 원리를 알고 사용하길 바랍니다.


이제 IAT Rebuilding을 하기 위해 Fix Dump 버튼을 누르면 파일 열기 창이 나오고 미리 Dump 해놓은 unpackme_05_dump.exe 파일을 선택하고 열기를 누르면 원본 파일 경로에 unpackme_05_dump_.exe 라는 파일이 생기게 됩니다.


확인하여 보면 Packing되었던 파일보다 Unpacking된 파일의 용량이 더 증가한 것을 볼 수 있습니다. 이는 UPX Packer는 압축을 주 목적으로 하는 Packer이기 때문입니다. 또한 Unpacking을 하게 되면 메모리의 기본 단위(Page)의 사이즈와 파일의 기본 단위(Block)의 사이즈가 차이를 보여 용량이 더 증가하게 됩니다.

Unpacking된 파일을 실행하여 보면 Packing되었던 파일처럼 정상적으로 실행이 됩니다. 그러나 운영체제가 바뀌게 되면(XP에서 Vista, 또는 XP에서 Win98와 같은 형식의 다른 OS인 경우) 정상적으로 실행이 되지 않을 수 있습니다.

hcsCP

2010.06.12
14:58:47
(*.32.251.2)
안녕하세요,
스톨른 바이트에 대해 정보를 찾다가 들리게 되었습니다.
이 글을 참고로해서 제가 블로깅 해도 되나요??
블로그에 공부하면서 글을 적고 있거든요...

그리고,,
최근에도 보안에 대해 블로깅 하시는지
궁금합니다. ㅎ

그럼 수고하세요-

엔신

2010.06.13
16:09:25
(*.213.13.198)
들려주셔서 감사합니다.
참고하셔서 블로깅 하신다면 저야 영광이죠. ^^
List of Articles
번호 제목 글쓴이 날짜 조회 수sort
260 [VBA] 엑셀 시트명 가져오기 엔신 2013-01-22 130497
259 Security Nessus 설치, 사용법 file 엔신 2008-12-11 92359
258 DBMS MySQL 설치/사용시 나는 에러 유형별 대처방법 엔신 2008-02-24 62835
257 CCNA 14.[EIGRP] file 엔신 2008-05-26 54207
256 [APC3.0] AhnLab Policy Center 3.0 관련 모듈 목록 엔신 2013-03-21 52102
255 [VBA] 파워포인트 그림 리사이즈, 위치 고정 엔신 2013-02-21 51627
254 freeware hex editor 엔신 2013-01-22 50452
253 Programming COleDateTime 클래스 엔신 2009-11-23 42450
252 Linux 삭제 파일 복구하기 debugfs 엔신 2008-02-23 40969
251 Security base64 code 표 file 엔신 2009-01-20 40204
250 WideCap을 통한 Proxy 이용 file 엔신 2013-04-20 39782
249 CCNA ACL(Access List) 설정하기 file 엔신 2008-05-28 39779
248 Windows 64비트 운영체제에서 아크로뱃 설치시 adobepdf.dll 파일이 없다고 할 때 [5] file 엔신 2007-07-25 37656
» RCE [MUP] UPX & Stolen Bytes [2] file 엔신 2009-02-17 36716
246 CCNA Frame-relay(프레임릴레이) multipoint 방식 풀메쉬 토플로지 구현 file 엔신 2008-06-09 35975
245 Security SSH Port Forwarding(SSH Tunneling) [2] file 엔신 2009-05-29 35635
244 CCNA 서브넷팅 : 가장효율적으로 IP를 할당할수 있는 방법!!(VLSM) 엔신 2008-05-12 33195
243 Windows VMware VMwareDnD 폴더 엔신 2009-03-07 33110
242 RCE Windows Anti-Debug Reference [7] file 엔신 2009-06-10 32863
241 Programming [JSP] JSP 요약 엔신 2010-07-07 32277