악성코드 분석에 있어 제일 걸림돌은 무엇일까? 복잡한 알고리즘? 안티 디버깅? 개인적으로 바이너리 패킹(Binary Packing)이라고 생각이 든다. 악성코드 제작자 입장에서 악성코드 분석을 가장 쉽게 저지하는 방법은 악성코드 프로그램을 분석하지 못하도록 패킹하여 분석을 어렵게 하는 것인데, 이를 해결하기 위해 분석가들은 여러가지 노력을 하게 된다.

보통 언패킹을 하게 되면 알려지지 않은 악성코드 제작자의 독자적인 패킹을 풀기 위해 매뉴얼 언패킹을 시도하거나 알려진 패킹의 경우 패킹 제작자가 만든 언패킹 프로그램(언패커)를 사용하여 패킹을 풀게 된다. 언패킹을 할 때 매뉴얼 언패킹과 언패커를 이용한 언패킹이 정석이고 가장 좋은 방법이긴 하다. 하지만 과연 이 방법 밖에는 언패킹 하는 방법이 없는 것일까? 디지털 포렌식을 공부한 사람이라면 'No' 라고 대답 할 것이다. 이번 글에서 소개 할 메모리 덤프를 이용한 언패킹 방법이다. 메모리 덤프를 이용한 언패킹 방법은 다음과 같이 두 가지로 나뉘게 된다.


1. 메모리 캡쳐 파일을 이용한 프로세스 또는 DLL 파일 덤프를 이용한 방법


2. 프로세스의 크래시 덤프를 이용한 방법


1번의 경우 외국에서 이미 Volatility를 이용 해 소개 된 방법이다. 물론 소개 되기 전에도 여러 포렌식 전문가들은 이 방법을 알고 있었을 것이다. 이 글에서 소개 할 방법은 2번 방법이다. 2번 방법 또한 여러 포렌식 전문가들은 개인적으로 알고 있을지도 모른다.

하지만 이 글을 쓰는 이유는 조금 더 이 방법을 알리고, 이런 방법도 있다라는 것을 알리기 위함이다.(개인적으로는 블로그 포스팅 목적도 있다.... ^^;;)


그럼 이제부터 2번 방법에 대해 한번 살펴보자. 샘플로는 PEiD에서 스캔하지 못하는 패커로 패킹되어 있는 악성코드 샘플을 대상으로 하도록 하겠다. 먼저 대상 샘플 프로그램을 패커 스캐너로 스캔하여 보면 다음과 같이 결과가 출력되는 것을 볼 수 있다.


[그림 1 - PEiD 스캔 결과]


[그림 1]을 보면 Noting found라는 문자열과 함께 패커 스캔을 실패한다. 문자열을 보아도 별다른 내용을 찾을 수 없고 디버거 툴로 열어 보아도 크게 악성코드라고 할만한 부분은 보이지 않는다.


[그림 2 - 문자열]


이제 이 글의 주요 목적은 크래시 덤프를 이용 해 언패킹을 시도 해 보자. 크래시 덤프는 Windows에서 기본적으로 지원하는 작업관리자 프로세스를 이용해서 Full Dump를 수행 할 수도 있고 Process Explorer 또는 Process Hacker등으로 Mini Dump 또는 Full Dump를 수행 할 수 있다. 또 Windbg를 이용해서 프로세스 메모리를 덤프 할 수도 있다. Windbg를 이용할 경우 프로세스 메모리 덤프 후 바로 분석 가능하다는 장점이 존재한다. 이 글에서는 작업관리자와 Process Explorer를 이용하도록 하겠다.


먼저 작업관리자를 이용해 보자. 프로그램을 실행하게 되면 다음과 같이 프로세스 목록에 샘플 프로그램의 프로세스 생성된 것을 볼 수 있다.


[그림 3 - 작업관리자 프로세스 탭]


여기서 마우스 오른쪽을 클릭하게 되면 "덤프 파일 만들기"가 보이게 되는데, 이 기능을 수행하게 되면 작업 관리자는 Full Dump를 수행 하고 파일 저장 위치를 알려준다.


[그림 4 - 작업관리자의 프로세스 메모리 덤프]


분석 방법은 이 글 마지막에 언급하도록 하겠다.


이번에는 Process Explorer 프로그램을 이용 해 덤프해보자. 방법은 거의 동일하다.


[그림 5 - Process Explorer를 이용한 프로세스 메모리 덤프]


위와 같은 방법으로 메모리 덤프를 수행하고 덤프 파일의 문자열을 출력 해보면 다음과 같이 문자열들이 많이 바뀐 것을 볼 수 있다.


[그림 6 - 악성 행위로 보이는 문자열들]


해당 덤프 파일을 크래시 덤프 파일이므로 일반 크래시 덤프 파일을 분석하듯 Windbg 등을 이용 해 분석을 수행 하면 된다.

그런데, 여기서 한가지 의문점이 생길 수 있다. DLL 인젝션을 이용 해 정상 프로세스에 악성코드가 인젝션되어 실행 된거나 숨겨진 프로세스라면 어떻게 할까?

이런 경우에는 지금 소개 했던 방법보다 1번 방법인 전체 메모리 덤프 파일을 이용 해 악성 DLL 파일을 찾아내 해당 DLL 파일을 덤프 해 분석하는 방법을 추천한다. 악성 DLL 파일을 찾는 방법으로는 대표적으로 Volatility의 malfind 플러그인을 이용하면 된다. 오탐이 없는 것은 아니지만 탐색율은 굉장히 좋은 편이다.


사실 이 방법들은 꼼수(?)이기 때문에 완벽한 결과물을 바라면 안된다. 가장 완벽하게 모든 분석을 끝마치려면 매뉴얼 언패킹이나 언패커를 이용해야 한다. 지금 소개한 메모리 덤프를 이용한 방법들은 분석이 시간을 다투거나 어떤 기능을 가지고 있는지 볼때에 사용하면 좋은 방법이니 참고하기 바란다. "모로 가도 서울만 가면 된다" 라는 속담도 있지 않은가.

저작자 표시 비영리 변경 금지
신고

'[+] Information > [-] RCE' 카테고리의 다른 글

소소한 Unpacking TIP  (8) 2013.01.09
ARE(Android Reverse Engineering) 환경 소개  (5) 2012.05.05
Oter : Android Revese Engineering Tool  (8) 2012.01.30
PE 구조 (8)  (0) 2012.01.01
PE 구조 (7)  (0) 2012.01.01
  1. Ezbeat 2013.01.09 22:40 신고

    덤프떠서 windbg로 분석할수있는 방법은 괜찮네요 ㅎㅎ 급하게 할땐 이방법이 더 나은것 같습니다
    하지만.. 리버싱하면서 언패킹을 하지못하면 왠지 지는 느낌을 받는건 뭘까요...ㅠㅠ

    • Favicon of http://maj3sty.tistory.com BlogIcon MaJ3stY 2013.01.10 09:32 신고

      리버싱을 배웠다면 언패킹은 기본적으로 할줄알아야 한다는 이 업계에 불편한 사고방식에서 비롯된 자괴감인듯 ㅠㅠ
      그래서 저도 가끔 이런 방법을 사용하고 공부할 겸 언팩할때는 무조건 매뉴얼 언패킹 한답니다 ㅋㅋ 실무에서는 언패커나 이런 방법이 더 시간적인 면에서 효율적이겠지만요 ㅎ

  2. Favicon of http://sun2day.tistory.com BlogIcon Sun2Day 2013.01.10 00:13 신고

    제목상.. 소소한 unpacking 이라고해서 들어왔는데.. 그 내용은 아닌듯!!
    그 외, 작업관리자에서도 덤프를 뜬다는건 몰랐으니 thanks
    성빈이 좀 갈궈봐요 선배라고 너무 방치하지말고.. ㅎㅎ

    • Favicon of http://maj3sty.tistory.com BlogIcon MaJ3stY 2013.01.10 09:34 신고

      ㅎㅎ 작업관리자로 덤프뜨는건 Windows Vista던가?? 아마 이때부터 될꺼에요 ㅎㅎ

      성빈이형은 연락도, 만나지도 못하고 있답니다... 그리고 갈굴만한 실력이 못되서요 ㅠㅠ

  3. 2013.10.12 20:37

    비밀댓글입니다

    • Favicon of http://maj3sty.tistory.com BlogIcon MaJ3stY 2013.10.15 14:37 신고

      더미다는 기본적으로 안티메모리덤핑 옵션이 체크되어 있습니다. 그래서 메모리 덤프가 안되는거구요. 이때는 정적분석이나 안티디버깅을 우회하여 동적분석을 하는 방법 밖에는 없습니다.

    • 2013.10.17 01:00

      비밀댓글입니다

    • Favicon of http://maj3sty.tistory.com BlogIcon MaJ3stY 2013.10.19 16:21 신고

      그럼 그건 메모리 덤프를 잘못 하신 것 같네요 ^^;

제목 그대로 ARE 환경을 소개 하려는 글이다. 현재 Android 악성 App을 분석할 수 있게 도와주는 여러 도구들은 꽤 많이 배포되고 업데이트 되고 있다. 하지만 이 대부분의 도구들을 하나의 환경에서 설치하고 실행하기란 여간 귀찮고 까다로운일이 아닐 수 없다. 이러한 작업들을 Honeynet에서 대신해주었다. 바로 지금부터 소개할 ARE 프로젝트이다. ARE 프로젝트는 여러가지의 Android 악성 App 분석 도구들을 하나의 OS, 즉 ubuntu에 모아 설치하여 분석가에게 편의를 제공하는 프로젝트이다.

이러한 환경은 오라클에서 개발하고 배포하는 무료 가상 소프트웨어 Virtual Box 이미지로 배포되고 있다.


프로젝트 및 다운로드 주소 : http://redmine.honeynet.org/projects/are/wiki


해당 환경에 설치 된 도구들은 다음과 같다.



일단 ARE 환경은 tar로 압축되어 배포 되고 있는데 압축을 해제 한 후 로딩하여 보면(로그인 패스워드는 android) 다음과 같이 Main 화면을 볼 수 있다.


[그림 1 - ARE Main]


처음에 환경을 로딩하고 나서 수정해주어야 할 점이 있다. 바로 adb 명령 path 설정이다. 왜 설정이 안되어 있는지는 모르겠지만 일단 adb 설정이 안되어 있으면 DroidBox 등을 실행 할 경우 굉장히 귀찮아진다.(소스 수정까지 해야 한다.)


그렇기 때문에 아래와 같이 수정을 해주어야 한다.


터미널을 Open 한 후 


#vi .bashrc


/home/android/tools/android/android-sdk-linux_x86/tools/

/home/android/tools/android/android-sdk-linux_x86/platform-tools/


위 두가지를 PATH에 추가한다. 아래 처럼!



[그림 2 - 환경변수 PATH 수정]


export 명령을 사용해도 되지만 부팅 시 export 명령으로 한 설정은 사라지기 때문에 이렇게 설정하는 것이다.


그리고 sdk를 업데이트 해주어야 한다. 아무래도 프로젝트가 현재 진행이 되질 않다보니 환경에 있는 안드로이드 에뮬레이터 또한 최신 버전등이 없다. 


#/home/android/tools/android/android-sdk-linux_x86/tools/android update sdk


위 명령을 실행하게 되면 다음과 같이 SDK Manager 대화상자가 나오고 업데이트 해야 할 목록들이 나오게 된다.



[그림 3 - SDK Manager]


업데이트 할 목록들을 선택하여 Accept를 해주어도 되고 모두 설치하려면 Accept All을 클릭해주고 Install 버튼을 누르면 된다.


이제 분석할 환경설정이 모두 끝이 났다. 간단하게 DroidBox를 통해 동적분석을 수행해 보자.


 * 참고 : 사용자 홈 디렉토리의 하위 디렉토리인 tools 디렉토리에 분석 도구들이 설치되어 있다.


DroidBox는 Apk 파일을 Sandbox 환경에서 실행시켜 어떤 동작을 하는지 모니터링 한 후 그 결과를 사용자에게 출력하여 준다. 정적분석을 할 때 만약 암호화 되어 있는 주소나 포트등이 있다고 하더라도 결국 동적 분석에서 모두 알 수 있다. DroidBox는 기본적으로 다음과 같은 행동들을 모니터링 한다.


  • Incoming/outgoing network data
  • File read and write operations
  • Started services and loaded classes through DexClassLoader
  • Information leaks via the network, file and SMS
  • Circumvented permissions
  • Cryptography operations performed using Android API
  • Listing broadcast receivers
  • Sent SMS and phone calls

대부분 악성 App이 하는 악성 행동만을 모니터링 한다.

일단 DroidBox는 안드로이드 에뮬레이터를 이용하기 때문에 DroidBox 디렉토리 안에 있는 startemu.sh로 에뮬레이터를 실행 시켜준다.

[그림 4 - startemu.sh]


Android21은 AVD 이미지 이름으로 /home/android/.android/avd 에 존재한다. 그래서 이전에 에뮬레이터 버전들을 업데이트 해 준것이다. SDK Manager를 실행하여 에뮬레이터 이미지를 생성하여 주면 여러 버전에서 App를 테스트하여 볼 수 있다.

에뮬레이터가 정상적으로 실행 됬다면 droidbox.sh를 실행하여 준다.

#./droidbox.sh sample.apk

이 명령으로 실행하여주면 아래와 같이 분석을 수행한다.

[그림 5 - DroidBox 분석화면]


분석결과가 실시간으로 출력되지는 않는다. Collected~ 문자열에서 숫자는 모니터링 한 로그 수를 의미하는데 이 로그가 높으면 높을 수록 조금 더 정확한 결과와 많은 결과를 얻을 수 있다. 필자가 테스트 해 본 결과 80~85 로그수가 제일 적당하다. 100이상을 넘어가면 터미널 창에서 모든 결과가 보이지 않아 다시 실행해야 하는 낭패를 볼 수 있다. 아니면 > 를 이용하여 출력화면을 저장해도 좋다. 


아래는 잠깐의 분석을 통해 나온 결과이다.


[Info]

     ------

        File name: sample.apk

        MD5: c3a0f5d584cc2c3221bbd79486578208

        SHA1: 81781c90e79bf19ea0acb67df6b9bf636a520367

        SHA256: c6eb43f2b7071bbfe893fc78419286c3cb7c83ce56517bd281db5e7478caf995

        Duration: 578.77789402s



     [File activities]

     -----------------


        [Read operations]

        -----------------

           [149.832055092] Path: /data/data/com.android.calendar/shared_prefs/_has_set_default_values.xml(

            Data: <?xml version='1.0' encoding='utf-8' standalone='yes' ?>

<map>

<boolean name="_has_set_default_values" value="true" />

</map>




        [Write operations]

        ------------------


     [Crypto API activities]

     -----------------------


     [Network activity]

     ------------------


        [Opened connections]

        --------------------

           [43.371598959] Destination: incorporateapps.com Port: 80


        [Outgoing traffic]

        ------------------

           [43.7593550682] Destination: incorporateapps.com Port: 80

            Data: POST /wat.php HTTP/1.1

Content-Length: 284

Content-Type: application/x-www-form-urlencoded

Host: incorporateapps.com

Connection: Keep-Alive

User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)

Expect: 100-Continue





        [Incoming traffic]

        ------------------


     [DexClassLoader]

     -----------------

     [Broadcast receivers]

     ---------------------

     [Started services]

     ------------------

     [Enforced permissions]

     ----------------------


     [Permissions bypassed]

     ----------------------


     [Information leakage]

     ---------------------

           [56.98290205] Sink: Network

            Destination: incorporateapps.com

            Port: 80

            Tag: TAINT_IMEI

            Data: SECOND_TABLE=0&imei=357242043237517&timestamp=1336213509&phoneinfo=System+-+generic%2Fgeneric%2Fgeneric%2F%3A2.1-update1%2FEPE54B%2Feng.pjlantz.20110606.044729%3Aeng%2Ftest-keys%0AModel%3A+unknown-GT-I9000-Samsung+GT-I9000%0A+Brand%3ASamsung+%0AOSVers%3A2.1-update1+Locale%3Aen_US+%0A


     [Sent SMS]

     ----------


     [Phone calls]

     -------------


어떠한 행동을 하는지 확인되었다면 그만큼 정적 분석은 쉬워질 것이다. 왜 File 을 Write하고 정확히 유출하는 정보는 무엇인지 정적분석을 통해 알아내면 된다.

저작자 표시 비영리 변경 금지
신고

'[+] Information > [-] RCE' 카테고리의 다른 글

소소한 Unpacking TIP  (8) 2013.01.09
ARE(Android Reverse Engineering) 환경 소개  (5) 2012.05.05
Oter : Android Revese Engineering Tool  (8) 2012.01.30
PE 구조 (8)  (0) 2012.01.01
PE 구조 (7)  (0) 2012.01.01
  1. Favicon of http://extr.tistory.com BlogIcon extr 2013.03.05 23:16 신고

    잘봤습니다 ㅎㅎ

  2. Android 2014.04.04 00:56 신고

    안녕하세요. 설치하는데 굉장히 시간이 오래 걸리던데, 설치 후 tar 로 압축만 풀면 진행이 되나요?..
    저 같은 경우 압축 푸니깐 파일 두개가 생기던데...어디서 잘못되었는지 모르겠내요.

    virtual box는 따로 설치를 해야하는건가요?...

    • Favicon of http://maj3sty.tistory.com BlogIcon MaJ3stY 2014.04.04 11:16 신고

      버츄얼박스는 따로 설치하셔야 하고, tar 파일을 풀면 버츄얼 박스 이미지 파일들이 나옵니다.

  3. Favicon of http://roomb16.tistory.com BlogIcon kunst. 2016.05.24 00:25 신고

    덕분에 잘 설치했습니다. 감사합니다!

Toorcon2011 에서 발표된 안드로이드 리버싱 툴 입니다.(관련기사 :  http://www.dailysecu.com/news_view.php?article_id=1567)

파일을 올리려고 했으나 티스토리 파일 업로드 제한 크기인 10MB를 조금 넘어 다운로드 링크를 걸어 둡니다.

링크가 죽었거나 하면 댓글 남겨주세요. 보내드리겠습니다.


위 이미지는 Mac OS X Lion으로 돌렸을 때의 인터페이스 입니다.

다운로드 URL :  http://otertool.com/toorcon2011/
저작자 표시 비영리 변경 금지
신고

'[+] Information > [-] RCE' 카테고리의 다른 글

소소한 Unpacking TIP  (8) 2013.01.09
ARE(Android Reverse Engineering) 환경 소개  (5) 2012.05.05
Oter : Android Revese Engineering Tool  (8) 2012.01.30
PE 구조 (8)  (0) 2012.01.01
PE 구조 (7)  (0) 2012.01.01
  1. 2012.08.13 20:00

    비밀댓글입니다

  2. 2012.10.18 19:59

    비밀댓글입니다

    • Favicon of http://maj3sty.tistory.com BlogIcon MaJ3stY 2012.12.07 20:43 신고

      답변이 너무 늦었군요 ㅠㅠ ...

      그나저나 메일이 어디에 있는걸까요 ㅎㅎ;

  3. 2012.12.30 20:23

    비밀댓글입니다

  4. Favicon of http://asecbug.tistory.com BlogIcon Asecbug 2012.12.31 11:42 신고

    감사합니다 :) 새해복 많이받으세요 ^^

  5. 2016.02.03 09:58

    비밀댓글입니다

이번에는 이전 글에서 다루지 못한 .rsrc 섹션에 대해서 알아보도록 하겠다.

[.rsrc 섹션]
이 섹션은 GUI 프로그램에서 많이 볼 수 있는 섹션으로 그래픽 정보를 저장하는 섹션이다.
해당 섹션의 구조는 다른 섹션과는 달리 트리구조로 되어 있으며 이 트리를 구성하는데 있어 각 노드들에는 두가지의 구조체가 있다. IMAGE_RESOURCE_DIRECTORY라는 구조체와 IMAGE_RESOURCE_DIRECTORY_ENTRY 구조체이다.
또 섹션의 트리에는 속하지 않지만 실제 리소스들의 대한 정보를 가지고 있는 IMAGE_RESOURCE_DATA_ENTRY
구조체가 있다.
해당 섹션의 속성정보를 알아본 뒤 각 구조체에 대해서 알아보도록 하겠다.
 - IMAGE_SCN_CNT_INITIALIZED_DATA
 - IMAGE_SCN_MEM_READ

[IMAGE_RESOURCE_DIRECTORY]
해당 구조체는 해당 노드에 대한 정보를 가지고 있는 구조체로, 아래와 같은 형태이다.

[그림 1 - IMAGE_RESOURCE_DIRECTORY 구조체 형태]

 - Characteristics : 속성정보를 나타내지만 현재는 예약 영역으로 쓰이고 있어 항상 0으로 설정되어 있다.
                            크기는 4바이트 이다.

 - TimeDateStamp : 섹션이 컴파일된 날짜와 시간을 의미한다. 하지만 현재 쓰이지 않고 있어 0으로 설정되어 있다.
                             크기는 4바이트 이다.

 - MajorVersion : 리소스의 주버전을 나타낸다. 하지만 현재 쓰이지 않고 있어 0으로 설정되어 있다.
                         크기는 2바이트 이다.

 - MinorVersion : 리소스의 하위버전을 나타낸다. 하지만 현재 쓰이지 않고 있어 0으로 설정되어 있다.
                         크기는 2바이트 이다.

 - NumberOfNameEntries : 해당 노드 다음에 나오는 노드들 중 이름으로 자신을 구별하는 노드들의 개수를
                                       가지고 있다. 크기는 2바이트 이다.

 - NumberOfIdEntries : 해당 노드 다음에 나오는 노드들 아이디로 자신을 구별하는 노드들의 개수를 가지고 있다.
                                 크기는 2바이트 이다.

결국 이 구조체에서는 마지막 2개의 구조체 멤버만 쓰인다. 


[IMAGE_RESOURCE_DIRECTORY_ENTRY]
해당 구조체는 다른 노드나 하위 노드들의 정보와 실제 리소스 데이터를 가지고 있는 구조체이다.
구조체의 형태는 아래와 같다.

[그림 2 - IMAGE_RESOURCE_DIRECTORY_ENTRY 구조체 형태]


 - Name : 만약 엔트리가 이름으로 구별되어질 경우 사용하는 멤버이다. 최상위 1비트가 1로 설정되어 있으며,
               나머지 31비트는 실제 이름스트링을 가리키는 오프셋(RVA)이다. 크기는 4바이트 이다.
* 참고 : 오프셋 위치는 IMAGE_RESOURCE_DIRECTORY부터 시작이다.
 

 - Id : 만약 엔트리가 아이디로 구별되어질 경우 사용하는 멤버이다. 최상위 1비트가 0으로 설정되어 있으며, 하위
         16비트가 정수로 Id를 뜻한다. 크기는 4바이트 이다.

 - OffsetToData : 만약 엔트리가 아이디를 사용하면, 최상위 1비트는 0으로 설정되며, 나머지는 실제 리소스의
                        오프셋이 된다. 만약 또 다른 엔트리를 가리킬 경우, 최상위 1비트는 1로 설정되며, 나머지는
                        오프셋이 되어 또 다른 엔트리를 가리킨다. 크기는 4바이트 이다.


[IMAGE_DIRECTORY_DATA_ENTRY]
해당 구조체는 실제 리소스들이 저장된 위치와 크기, 코드 페이지 등에 대한 정보를 가지고 있다.
아래는 해당 구조체의 형태이다.

[그림 3 - IMAGE_DIRECTORY_DATA_ENTRY 구조체 형태]

 - OffsetToData : 실제 리소스 데이터가 위치해 있는 주소의 RVA값을 가지고 있다. 크기는 4바이트 이다.

 - Size : 리소스 데이터의 크기이며, 단위는 바이트이다. 크기는 4바이트 이다.

 - CodePage : 리소스 데이터의 코드 페이지 값이다. 보통은 유니코드를 사용하며 값은 0으로 설정되어 있다.
                     크기는 4바이트 이다.

 - Reserved : 예약 영역이며, 0으로 채워져 있다. 크기는 4바이트 이다.


이제 각 구조체가 어떻게 트리형태로 구성되는지 알아볼 차례이다.

아래는 각 구조체와 노드가 어떤 형태로 트리구조를 형성하고 있는지 도식화 한 것이다.

[그림 4 - .rsrc 트리구조]


맨 위 루트노드는 각 하위 노드들을 찾는데에만 사용이 되며, 루트 하위 노드들은 각 리소스 타입을 대표하는 노드들로 사용이 된다. IMAGE_RESOURCE_DIRECTORY_ENTRY의 개수에 따라 해당 노드는 NumberOf[Name/ID]Entries의 값이 결정된다.
예를들면 루트 하위 노드들이 이름으로 구분지어 지면 루트노드의 NumberOfNameEntries의 값은 3이 되는 것이다.
* 참고:  .rsrc의 트리구조가 모두 위 이미지처럼 IMAGE_RESOURCE_DIRECTORY_ENTRY의 개수가
          일정한 것은 아니다.



 


저작자 표시 비영리 변경 금지
신고

'[+] Information > [-] RCE' 카테고리의 다른 글

ARE(Android Reverse Engineering) 환경 소개  (5) 2012.05.05
Oter : Android Revese Engineering Tool  (8) 2012.01.30
PE 구조 (8)  (0) 2012.01.01
PE 구조 (7)  (0) 2012.01.01
PE 구조 (6)  (0) 2011.12.31
이번에는 실행파일에서의 핵심구조인 섹션을 알아 볼 차례이다.

앞에서 알아본 PE 구조들은 실행파일들의 정보나 메모리에 로드될 때의 정보 등이었지만 지금 알아 볼 섹션은 실행파일의

동작에 관한 정보들이다. 

섹션에는 여러가지 섹션이 있는데, 대부분 .text, .data, .rdata, .rsrc, .edata, .idata, .reloc 섹션이 많이 사용된다.

각 섹션이 의미하는 바는 각 섹션을 분석할 때 설명할 것이다.

분석하고자 하는 파일의 섹션정보는 PE File Header를 보면 NumberOfSections에 섹션 개수가 나타나 있으며, 각 섹션의

위치 정보 등은 Section Header 영역에 보면 나와 있다.

아래는 notepad.exe 섹션정보를 Hex Viewer 등으로 본 이미지이다.

[그림 1 - NumberOfSections]

[그림 2 - 섹션헤더 영역의 섹션 이름]
 
notepad.exe에는 총 4가지의 섹션이 있으며, 섹션의 종류는 .text, .data, .rsrc, .reloc 이 있다.

이제부터 하나씩 상세히 알아보도록 하겠다.

[.text 섹션]
.text 섹션은 실행파일의 소스코드가 들어있는 섹션으로, 초기화되거나 초기화 되지 않은 변수, import와 export 테이블
정보를 제외한 나머지 소스코드들이 저장되어 있다. 해당 섹션의 기본 속성정보로는 아래와 같다.
 - IMAGE_SCN_CNT_CODE
 - IMAGE_SCN_MEM_EXCUTE
 - IMAGE_SCN_MEM_READ

섹션의 위치와 크기는 섹션헤더(PointerToRawData, SizeOfRawData)를 참고하면 알 수 있으며 아래는 .text 섹션
헤더에서의 PE 파일 내에서의 .text 섹션 위치와 크기를 알아 본 것이다.

* 참고 : 메모리상에서의 주소와 크기는 VirtualAddress, VirtualSize를 참조하면 된다.

[그림 3 - .text 섹션의 오프셋과 크기]


위 정보를 보면 PE 파일내에서의 주소는 주소는 "0x00000400", 크기는"0x0000A800" 이다.
.text 섹션의 마지막 오프셋은 주소와 크기를 더하게 되면 나오고 결과값은 "0x0000AC00" 가 된다.
이 정보를 토대로 가보면 아래와 같다. 

[그림 4 - .text 섹션의 모습]

섹션의 모습을 보면 어느정도 데이터가 있다가 나머지는 0으로 채워져 있다. 이러한 이유는 SizeOfRawData의 경우 FileAlignment(IMAGE_OPTIONAL_HEADER)의 배수가 되어야 하므로 실제 데이터의 크기를 가지고 있는 VirtualSize의 값을 FIleAlignment의 값의 배수로 올림하여 크기가 늘어나 채울 데이터가 없어 0으로 채운것이다.
실제 메모리에 .text 섹션이 올라갈때는 0을 제외하고 올라가게 된다. 


이러한 방법으로 모든 섹션의 영역을 찾을 수 있다.

이 방법을 계속 섹션마다 사용하여 영역을 찾는 것을 보여 줄 수는 없기 때문에 이후에 나오는 섹션들은 특징과 속성정보등만

소개하겠다.

[.data 섹션]
.data 섹션은 읽기/쓰기가 가능한 일반적인 데이터를 위한 섹션으로, 정적변수와 전역변수가 저장된다. 
해당 섹션의 기본 속성정보는 아래와 같다.
 - IMAGE_SCN_CNT_INITIALIZED_DATA
 - IMAGE_SCN_MEM_READ
 - IMAGE_SCN_MEM_WRITE 


[.rdata]
.rdata 섹션은 읽기전용 섹션으로 상수와 배열로 직접 정의된 문자열과 런타임 라이브러리에서 사용하는 에러 메시지 등이 저장된다. 가끔 debug섹션이나 DLL import 섹션이 크기가작고 읽기전용 속성을 가지면 .rdata 섹션으로 통합되는 경우가 있는데 이러한 현상이 일어나는 이유는 아직 밝혀지지 않았다. 
해당 섹션의 기본 속성정보는 아래와 같다.
 - IMAGE_SCN_CNT_INITIALIZED_DATA
 - IMAGE_SCN_MEM_READ 


[.idata, .edata 섹션]
.idata 섹션은 import table이 들어있으며, .edata 섹션은 export table이 의미한다. 이 섹션들은 실행하는데 꼭
필요한 섹션은 아니다.
.idata 섹션의 기본 속성정보는 아래와 같다.
 - IMAGE_SCN_CNT_INITIALIZED_DATA
 - IMAGE_SCN_MEM_READ
 - IMAGE_SCN_MEM_WRITE

.edata 섹션으 기본 속성정보는 아래와 같다.
 - IMAGE_SCN_CNT_INITIALIZED_DATA
 - IMAGE_MEM_READ 


[.reloc 섹션]
해당 섹션은 PE 파일이 메모리상에 로드 될 때 재배치에 관해 참조하는 정보가 들어있는 섹션이다.
실행파일의 경우 이 섹션은 필요하지 않을 수 있지만, DLL 파일의 경우 메모리에 로드 될때 재배치를 염두하고 있기 때문에 이 섹션이 없으면 실행이 되지 않을 수도 있다.
 - IMAGE_SCN_MEM_READ
 - IMAGE_SCN_CNT_INITIALIZED_DATA
 - IMAGE_SCN_TYPE_NOLOAD 


마지막으로 남은 .rsrc 섹션은 트리구조로 되어 있어 조금 내용이 많아 다음글에서 다루도록 하겠다.
 
저작자 표시 비영리 변경 금지
신고

'[+] Information > [-] RCE' 카테고리의 다른 글

Oter : Android Revese Engineering Tool  (8) 2012.01.30
PE 구조 (8)  (0) 2012.01.01
PE 구조 (7)  (0) 2012.01.01
PE 구조 (6)  (0) 2011.12.31
PE 구조 (5)  (0) 2011.12.31

+ Recent posts