한국어

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 Linux FTP서버 vsftpd 설치와 운영 (한글로그 패치 포함) [2] 엔신 10717   2006-11-04
작성자 : 좋은진호(truefeel, http://coffeenix.net/) 작성일 : 2003.10.01(수) 수정일 : 2004.01.08(목), chroot_list_enable 글 추가 이 글은 7월에 썼던 'vsftpd에서 한글파일로그와 lastlog 로긴확인하기'를 기초로 작성하였다. 1. vsftpd FTP 서버에 대해...  
259 Linux fedora linux 리눅스에서 텔넷(SSH) 한글 깨질 때 엔신 9291   2006-11-04
SSH로 접속했을 때 한글이 깨져 나온다면.... /etc/sysconfig/i18n 파일을 보시면 SUPPORTED="en_US.UTF-8:en_US:en:ko_KR.UTF-8:ko_KR:ko" SYSFONT="latarcyrheb-sun16" 이런식으로 있을텐데 이것을 다음과 같이 고치면 됩니다. LANG="ko_KR.eucKR" SUPPORTED...  
258 Windows netstat로 포트 감시하기 엔신 14568   2006-11-05
netstat 를 이용하여 간단하게 현재 포트를 감시할수 있습니다. (포트 스캐닝은 잘 알려져있듯이 크래커들이 쓰는 첫번째 방법입니다.) 시스템에서 현재 열려져 있는 포트 보여주기 #netstat -nlt n : numeric - 주소를 보여줍니다. l : listen - 열려진 포트 ...  
257 Linux tar 압축을 실수로 디렉토리 생성 안하고 풀었을때 대처법 엔신 27955   2006-11-05
가끔 다운받은 tar를 압축을 풀다보면 해당 디렉토리가 생기자 않고 현재 디렉토리에 모든 파일이 풀려버려 정신이 없을때가 있습니다. 이럴때 아래와 같은 옵션으로 해보세요. ^^ tar ftz 팩키지.tar.gz 위와 같이 하면 팩키지에 해당되는 파일들만 지워지게 ...  
256 Linux 웹사이트 운영자에게 꼭 필요한 무료 S/W 소개 [2] 엔신 8007   2006-11-05
웝메이져 님의 글입니다. 웹사이트 운영자에게 꼭 필요한 무료 S/W 소개 웹사이트 구축할 당시에만 신경을 쓰고 구축후에는 새로운 컨텐트를 올리고 멋있게 보이게 하는 것에 신경을 써서 기본적인 웹사이트 운영에는 소홀한 경우가 많으것 같아서 안타까웠습...  
255 Security 홈페이지 개발 보안 가이드 엔신 10530   2006-11-12
http://home.megapass.co.kr/~darkhi/20050427_homepage_security_guide.pdf 2005년 4월자 정보통신부 KISA 주관 받아놓고 보니 페이지가 만만치않아서 본적 없는 간지  
254 Ambiguous USB용 Putty(ssh, telnet 클라이언트) 엔신 15532   2006-11-15
ssh, telnet 클라이언트인 Putty의 포터블용(USB) 버전입니다. 설정 내용이 레지스트리에 저장되지 않고 파일로 저장되도록 수정되어서, USB에 넣고 다니기에 편하도록 만들어진 버전입니다. PortaPuTTY - Portable Putty for USB http://socialistsushi.com/p...  
253 Windows 윈도우 예약 종료 [1] 엔신 20282   2006-11-15
예 shutdown -s -f -t 180 180초 후에 실행되고 있는 프로그램을 강제로 종료하고 이 컴퓨터를 끈다. 로컬컴퓨터 종료 (-s) 응용프로그램 강제종료(-f) 종료시간 설정(-t xx) 시작 - 실행 - 열기에 at 05:30am shutdown -s 넣어주시면 됩니다. at 는 예약을 시...  
252 Windows Windows XP 서비스항목 상세 세팅 방법 엔신 31547   2006-12-17
1 Alerter 유 닉스 시스템에서 관리자가 경고 메시지를 보낼 때 쓰는 것처럼 이용자와 컴퓨터에 관리용 경고 메시지를 보낸다. PC에서는 내 PC와 연결된 다른 사람이나 컴퓨터에 경고 메시지를 보낼 일이 없으니까 수동으로 된 초기값을 사용안함으로 바꾸자. ...  
251 Ambiguous 픽픽(PicPick) v1.6.2 - 화면캡쳐 엔신 9694   2006-12-30
스네그잇 써왔는데 국산이고 기능도 맞먹는거 같네 http://wizip.naok.net/picpick.exe  
250 Ambiguous 고해상도 바탕화면 [2] 엔신 8535   2007-01-31
고해상도 바탕화면 사이트 모음 http://econquer.geenut.com/85  
249 Linux 태터툴즈 한글검색오류 수정방법안내 [4] 엔신 11934   2007-01-31
태터툴즈을 웹제로에서 사용시, 한글검색에서 한글인식이 안되는 문제가 있습니다. 그 이유는 mod_url 아파치모듈때문입니다. 이 모듈은 사용자가 윈도우사용시 utf-8 을 항상켬이란 고급옵션을 사용하면 주소창에 한글입력시 서버쪽파일을 감지못해서 한글이...  
248 ETC Tipping Point, 100마리째 원숭이 현상 엔신 10039   2007-01-31
<말콤 그래드웰>이 지은 <티핑 포인트-Tipping Point>라는 책이 있습니다. 망해가던 <허시파피> 신발회사의 신발을 뉴욕의 몇몇 히피족들이 신고 다니기 시작하더니 어느 날 갑자기 미국의 백화점을 휩쓸게 되었고, 처음 인기도 별로 없었던 <조앤 롤링>의 <해...  
247 Linux 리눅스_커널(The_Linux_Kernel_한글번역판).pdf 엔신 17038   2007-01-31
리눅스 커널 한글 번역판 오른쪽 버튼 눌러서 다른이름으로 저장 http://home.megapass.co.kr/~darkhi/리눅스_커널(The_Linux_Kernel_한글번역판).pdf  
246 Linux 리눅스 기본 명령어 엔신 7989   2007-02-07
ls -a: 디렉토리 내의 모든 파일 출력 -l : 파일 허용 여부, 소유자, 그룹, 크기, 날짜 등을 출력한다. -m: 파일을 쉼표로 구분하여 가로로 출력한다. -s : KB 단위의 파일 크기를 출력한다. -F : 파일의 형태와 함께 출력한다. 출력되는 파일의 형태는 '*', '...  
245 Linux gcc 엔신 10452   2007-02-07
! 모든 컴파일 과정을 한번에 처리하기 $ gcc –o filter filter_driver.c define_stack.c – -o 옵션은실행파일명을지정함 – 이 옵션을 지정하지 않으면 a.out이 실행 파일임 ! 필요한 소스 파일만 컴파일 하기 $ gcc -c filter_driver.c $ gcc -c define_stack...  
244 Ambiguous CD 굽기 프로그램 Infra Recorder [2] 엔신 9543   2007-02-18
폴더 용량 7.64MB (압축파일 2.75MB) 네로를 대체할만한 프로그램이 없다는 생각에(귀찮아서 찾아보지도 않음) 그냥 사용하고 있었는데 이올린에 올라온 글을 보고 다운받아봤다 한글언어팩도 만들어져있다 http://mr-dust.pe.kr/508 굳이 한글언어팩 없어도 ...  
243 Ambiguous 싸이월드 창 닫힘(닫히는, 꺼지는, 꺼짐) 현상 해결 [1] 엔신 16459   2007-03-06
컴퓨터 새로 사고 윈도우를 최적화 시디로 깔았더니 쾌적한 환경을 구축해줬다 그러나, 싸이월드에서 사진 올리기,기타 등등 에서 익스플로러 창이 다 꺼지는 현상이 발생하였다 바탕화면에 오류 메시지 파일이 생겼는데 거기엔 JVM 오류라고 다시 설치하라고 ...  
242 ETC 자전거 전국일주 15~20일 file 엔신 10886   2007-04-10
 
241 Linux 우분투 sshd 설치 엔신 13856   2007-05-04
sudo apt-get install ssh 나온대로 설치 그리고 ssh localhost 해주고 설정 해주면 됨