심플스 - 프로그램과 책 이야기로 가득한 곳, (Simples.Kr)

  

 

안녕하세요. esniper 입니다.
이제야 기술적인 이야기를 시작하게 되었네요.
먼저 당부의 말을 간단히 적고 강좌를 시작하겠습니다.

==당부의 말==
이 강좌는 델마당과 제가 운영중인 사이트인 심플스(http://simples.kr)에 원본 강좌가 있습니다.
델마당에 적는 리버싱 강좌는 리버싱을 처음 접하는 분들을 위해서 최대한 단순하고 쉽게 설명하고 있습니다.
일단 리버싱강좌의 특성상 안티리버싱(리버싱을 막는)보다는 분석하는 부분을 더 많이 다루게 될 것 같습니다.
결과적으로 막는 부분은 첫강좌에도 언급했지만 개인이 몇일 고민해서 막는 법을 추가한다고 될일은 결코 아닙니다.
프로그램을 보호하는 부분의 권장하는 방법은 상용화된 패커나 프로텍터를 사용하는 것입니다.
그리고 네트워크 프로그래밍에서는 철저한 암호화와 오류없는 꼼꼼한 코딩일 것입니다.

그럼에도 이런 분석하는 법을 강좌로 적는 이유는 최소한 어떻게 남에게 자신의 프로그램이 분석되고 있는지 정도는 알고 싶어하는 분이 계실테고, 본인이 스스로 막거나 상용화된 패커나 프로텍터를 사용할려고해도 어떤것이 좋은지 선택할 수 있는 정도의 지식을 배워놔야 할 것이기 때문입니다.
또한 일반적인 남의 정상적인 프로그램을 분석하기 보다는 악성코드(바이러스)와 같은 나쁜 용도의 프로그램들을 분석해야할 일도 많이 있을 것입니다. 자기 자신의 PC가 바이러스에 감염되었을 때도 원인 분석이 가능할 것이고, 남들을 돕기 위한 백신을 만들어서 배포하는 일도 가능해질 것입니다.

그리고 제가 강좌를 쓰는 가장 큰 이유는 델마당을 좋아해서 자주 들리는데, 델파이와 관련된 쪽의 리버싱 강좌를 보고 싶다는 분이 있어서 글을 쓰고 있는 것 뿐이며, 언제든지 강좌에 문제가 있다고 제시하시는 분이 있고, 그것이 타당하다면 바로 종료할 생각입니다.
주의 당부드려야 할 부분이 많고, 하고 싶은 말도 있지만, 강좌가 지저분해질 수 있으니 이정도로 정리하겠습니다.
* 마지막으로 다른 곳에 혹시라도 퍼가더라도 당부말은 삭제하지 말아주세요. - 당부의 말 끝.
===========


공부를 하면서 가장 중요한 것은 기본이 되는 도구에 익숙해지는 것입니다. 자기가 생각하는 것을 마음껏 표현하려면 먼저 디버거의 대표격인 OllyDebugger(이후 올리디버거로 칭함)를 자기 것으로 만드는 것이 중요합니다.
하지만 제가 시간관계로 툴에 대한 설명은 많이 못할 것 같습니다. 그래도 훌륭한 도움말이 있고, 툴이 워낙 잘만들어져있어서 하나하나 설명드리지 않아도 이해하는데 그리 오래 걸리지 않을 것입니다.

올리디버거는 http://www.ollydbg.de 사이트에서 제작 배포하는 툴이며, 아직까지는 1.10 버전을 가장 많이 사용 중이고, Pre-alpha버전으로 2.0이 업데이트 되어있는 상태이니 1.0을 다운로드 받아서 적당한 곳에 압축만 풀면됩니다.

참고로 올리디버거와 비슷하면서도 많이 사용하는 툴 중에는 파이썬 스크립트를 플러그인형태로도 이용가능 한 이뮤니티 디버거(http://www.immunitysec.com)도 있으니 추가로 다른 디버거 툴에도 관심이 있는 분들은 사이트에 접속하여 둘러 보길 바랍니다.

올리디버거는 유용한 플러그인이 많아서 몇가지 다운로드 받아서 설치하고, 도움말도 연결해서 사용하면 좋습니다.
일단 일일이 받기 귀찮을 것 같아서 제가 기본적인 Jmp구문 라인표시하는 설정과 윈도우 도움말 파일과 플러그인 몇가지를 합쳐 올려두었습니다. 커멘드 명령을 돕는 것과 한글깨지는 것 표현해주거나 메모리 덤프해주는 플러그인 정도가 추가되어있습니다.
또한 WIN32.HLP 헬프파일도 포함되어있으니 Help 메뉴에서 선택해서 사용하면 됩니다.

심플스 리버스엔지니어링 게시물을 참고하셔서 기타 파일들은 다운로드 받으시길 바랍니다.

설치하고 뭐하는데 시간을 너무 많이 할애할 수는 없으니 가장 기본적인 설정 몇가지를 하고 나서
델파이로 아주 예제 두개를 만들어서 디버깅 해보도록 하겠습니다.

1. odbg110.zip 압축을 푼 다음 가장 먼저 해주어야 할 부분은 UDD, Plugin 폴더를 지정으로 UDD파일은 브레이크 포인트 지점이나 사용자 설명들 같은 디버깅 설정을 저장하는데 쓰이며, Plugin은 플러그인 파일들을 넣어주어 불러올 때 쓰입니다.
올리디버거 실행파일 하위에 아래와 같이 폴더를 만들어 주고, 이미 만들어져있다면 설정만 변경해주면 됩니다.

2. Ollydbg.exe를 실행하고, Option -> Appearance -> Directories를 열고 UDD와 Plugin경로를 적어 준 후에 올리디버거를 다시 실행해주면 경로 설정은 완료됩니다.

3. 그 외에 옵션값 중에 윈도우 작업관리자에서 프로세스목록에서 바로 디버깅 연결이 가능한 Jit(Just-in-time debugging)설정과 탐색기에서 파일들 우클릭 메뉴로 연결 가능한 Add explorer를 설정 해두면 사용하기 편합니다.

4. WIN32.HLP 파일은 help메뉴에 연결시켜두면 디버깅 중에 윈도우API에서 오른쪽 마우스버튼 메뉴로 도움말을 쉽게 볼 수 있습니다.
Help메뉴에서 Select API help file 선택을 해서 WIN32.HLP을 열어주면 자동으로 앞으로 winapi 도움말과 연결하여 보여줍니다.

이 정도로 아주 기초적인 옵션을 마치고 실제 테스트 해볼 델파이 코드를 제작해보겠습니다.
이번 강좌에서 보여줄 부분은 2가지 입니다.

첫째는 프로그램 내부에서 사용되는 주요 문자열을 암호화 하지 않았을 경우 왜 위험한지
둘째는 대충 if문 몇개로 인증을 만들경우 어떻게 디버깅이 되는지

아주 단순한 테스트 코드를 제가 만들고, 그것을 올리디버거로 열어서 확인해보는 과정으로 진행하겠습니다.
이번 강좌는 올리디버거를 어떻게 사용하는지를 설명하기 위한 것이기도 해서 아주 단순한 예제를 이용해서 설명드리겠습니다.

아래 화면과 같이 디자인 했습니다.


내부에 저장된 문자열에 암호가 저장되어있고, 암호를 맞추면 되는 형태입니다.
물론 연습이니깐 소스와 프로그램 바이너리도 같이 올려두겠습니다.
일단 올리디버거 사용법을 설명하는게 목적이니 패킹은 하지 않겠습니다.

바이너리와 소스 포함 된 첨부파일(Reversing_Delphi_String_IF.zip)을 받으세요.


주요 소스는 아래와 같습니다.



procedure Tfrm_Main.Button1Click(Sender: TObject);   


  1. const  
  2.   PwString : String = 'delmadang';   
  3. begin  
  4.   if Edit1.Text = PwString then  
  5.   begin  
  6.     MessageBox(0'암호를 맞추셨네요. Pass!''Simples.kr', MB_ICONINFORMATION or MB_OK);   
  7.     Close;   
  8.   end  
  9.   else  
  10.   begin  
  11.     MessageBox(0'암호를 틀리셨네요. Wrong!''Simples.kr', MB_ICONINFORMATION or MB_OK);   
  12.     Edit1.SelectAll;   
  13.   end;   
  14. end;  

  15. const에 PwString이 있고, if문을 이용하여 Edit1의 문자열을 비교하는 루틴입니다.
    OllyDbg를 실행한 후에 바이너리 CrackMe1.exe을 File->Open 해서 열도록 합니다.

    이 문제의 목표는 물론 암호를 맞춰서 if을 통과하는 것입니다.
    미리 나중에 할 강좌 예고를 잠깐 하자면 ****로 처리되는 암호 값을 보는 방법에 대해서는 Winexp같은 컨트롤 핸들 제어를 통하는 툴을 이용해서 속성바꾸는 것 정도로 해서 할 계획입니다. // 예고 끝

    자 그럼 올리디버거에서 열린 화면을 한번 볼까요?



    ① 어셈블리코드가 보이는 부분
    ② 레지스터 상태가 나온 부분
    ③ Dump 창의 모습
    ④ 스택의 모습
    특히 ③ Dump창에는 힙 이나 FileMap, 또는 Text 영역의 값들이 올 수 있다. 이 부분은 해당하는 주소부분을 16진수로 보여주는 곳으로
    한눈에 스택, 힙, 레지스터, 실행 가능한 코드 부분을 다 볼 수 있기에 디버깅 작업이 편리해집니다.

    자 일단 화면이 나타났는데, 이제 어떻게 해야할까요?
    가장 단순한 방법으로는 내부에서 사용되는 문자열을 기준으로 해서 검색을 해봅니다.

    디스어셈블 된 코드가 보이는 화면에서 마우스 우클릭하고 메뉴에서 Search for => All referenced text strings 메뉴를 선택합니다.
    그럼 문자열들만 추려서 보여주게 되는데, 아랫 부분까지 쭉 스크롤하면서 확인해봅니다.





    놀랍게도 디버깅은 시작도 안했는데, 눈에 띄는 문자열을 발견했습니다.
    이런 문제는 사실 굳이 디버깅 하지 않아도 strings와 같은 명령어로 문자열만 추려내도 답을 어느정도 낼 수 있습니다.
    일단 문자열은 그냥 노출되는 거 확인했고, 자 이제 디버깅을 시작해보겠습니다.

    BP(브레이크포인트)설정은 F2이고, 시작은 F9입니다.
    그리고 스텝오버는 F8이며, 스템인은 F7입니다.
    가만보면 BP설정만 빼곤 델파이와 디버깅 단축키가 거의 동일합니다. // 무슨말인지 모른다면 델파이 디버깅 공부를 먼저!

    일단은 F9 실행을 해서 프로그램을 실행해보겠습니다.
    그리고 아무거나 넣으면 아래와 같은 메시지 창이 뜹니다.
    ---------------------------
    Simples.co.kr
    ---------------------------
    암호를 틀리셨네요. Wrong!
    ---------------------------
    확인  
    ---------------------------


    일단 소스를 본적이 없는 사람입장에서의 단서는 저런 메시지가 실행되기 바로전에 뭔가 비교를 했다는 것을 추측할 수 있습니다.
    자 어떻게 문제를 풀어야 할까요?
    아까 스트링 추출한 것을 보면 메시지창에 뿌려진 내용과 동일한 내용이 보입니다.
    참고로 한글로 된 메시지가 잘 보이는 이유는 xj10n.dll 플러그인이 설치되어있어서 입니다. 한글로 나타나지 않는다면 플러그인 폴더에 설치해주세요. 위 제 사이트에 올려둔 올리디버거를 받으셔도 됩니다.

     Address=00450ACF
     Text string=ASCII "암호를 틀리셨네요. Wrong!"

    해당 주소지로 가기 위해서 스트링 추출 창에서 해당 위치를 더블클릭하거나,
    혹은 디스어셈블 창에서 Ctrl + G 단축키로 주소지를 직접 이동합니다.

    주소지 부분을 보면, 어셈블리어를 모르는 개발자 분들이라도 대략은 이해가 될 것입니다.



    이 부분에서 생각을 해볼 수 있는 것들을 나열해보겠습니다.

    1. 뭔진 모르지만 CALL 이라는 것이 있고 난 후에 JNZ가 나왔다.
    2. JNZ에 커서를 둔 상태에서 JNZ가 실행되면 실행될 것 같은 화살표를 보니 암호를 틀리셨네요쪽으로 가고 있구나.
    3. 암호를 맞추셨네요. Pass! 라고 된 부분이 암호를 맞추면 나올 메시지구나.
    4. 암호는 뭘까? Call 안에서 뭔가 실행되면서 비교문이 나오는거 아닌가?
    5. 암호를 몰라도 암호를 맞췄을 때와 같은 메시지가 나오게는 할 수 있겠구나!
    6. JNZ 명령 다음에 나온 주소를 바꾸거나 그냥 해당 라인을 지워버리면 그냥 맞춘 것이 되겠네!
    생각 정리 끝.

    자 이제 위와같은 생각을 한 사람이라면 2가지 작업을 할 것입니다.
    1. CALL 명령의 내부로 들어가기 위해서 해당 주소에 BP(F2)를 걸고, 실행해본다음에 Step into(F7)를 통해서 함수 내부에서
       비교되는 암호문을 찾아보고 정확한 암호를 쳐서 처리한다.
    2. JNZ가 이동하는 주소를 바꿔버린다.
       혹은 JNZ명령어자체를 지워버린다. (NOP 처리한다.)
    * 아니면! 암호를 바꿔버린다. // delmadang이라는 문자열 차제를 바이너리에서 찾아서 바꿔버리는 사람도 있겠죠?

    역시 풀이는 수없이 많이 나올 수 있습니다.
    왜냐면 푸는 사람 맘이니깐요-_-

    일단 첫 예제 프로그램이고, 어셈블리어를 잘 모르는 분들도 있으니 가볍게 툴을 익히는 차원에서 2번 방법을 소개하고 다음 강좌에서 더 재밌는 분석방법을 설명하겠습니다.

    00450AAA  |. /75 1C         JNZ SHORT CrackMe1.00450AC8

    이 주소지에 커서를 두고, 스페이스 바를 누릅니다.(명령어 수정)
    00450AC8 주소로 가게 하지말고 아래 주소지로 가게 끔 하겠습니다.
    00450AAC  |.  6A 40         PUSH 40                                  ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL



    이와 같이 수정하고, 실행(F9)을 합니다.
    그리고 아무값이나 입력(즉 값이 틀리게)하면 성공했다는 메시지가 뜰것입니다.



    문제풀이가 완료되었습니다. 툴 연습이 되셨나요?
    이번 강좌는 툴에 익숙해지기 위해서 아주 간단한 예제를 통해서 알아보았습니다.
    스트링 추출을 하는 법과 Jump구문에서 주소지를 변경하여 루틴의 흐름을 바꾼 것입니다.
    다음 강좌부터는 같은 예제를 어떻게 더 쉽게 풀 수 있는지, if문이 어셈블리어로는 어떻게 표현되는지
    비교되는 실재 값은 어떻게 찾는지, 그 비교되는 값도 바이너리에서 수정해버리는 방법,
    변경을 하면 그 변경한 상태를 olly에서 바로 파일로 저장하는 방법...등등
    적다보니 설명해줄 부분이 너무 많네요 ^^;
    그럼 다음강에서 뵙겠습니다.

profile

먼 산 조각 구름은 거처가 없다.

첨부
엮인글 :
http://simples.kr/7644/16f/trackback

박은선

2009.03.14 13:11:26

강좌 잘봤습니다. 첨부하신 압축파일이 헤더가 잘못됬다고 나오는데, 저만그러나요?

항형

2009.03.14 13:11:26

감사합니다. 초보자가 따라하기 쉽게 잘 되었습니다. 잘보고 많이 배워갑니다.


2009-03-14 13:11:26, esniper wrote:

--- 따온 텍스트 [show/hide] ---



profile

esniper

2009.03.14 13:11:26

점프할 주소지를 수정하라는 설명이 있는 부분입니다.

화면에 스크린샷도 같이 있으니 참고하세요.



2010-05-06 03:02:56, cctory wrote:

--- 따온 텍스트 [show/hide] ---



김태우

2009.03.14 13:11:26

심플스 리버스엔지니어링 게시물을 참고하셔서 기타 파일들은 다운로드 받으시길 바랍니다.
: 게시물 을 어디서 찾아봐야 하나요? 잘 못찾겠네요


2009-03-14 13:11:26, esniper wrote:

--- 따온 텍스트 [show/hide] ---



단아

2011.03.23 22:50:18

좋은강좌 잘보고 갑니다!

이제서야 이런걸 보게되네요 ㅠㅠ

List of Articles
번호 제목 글쓴이 날짜 조회 수
26 도서자료실 [리버스엔지니어링] OllyDbg_and_CrackMe file [15] 관리자 2009-03-16 108737
» 도서자료실 [리버스엔지니어링] 3. 간단한 올리디버거 사용법(간단한 if문 우회 샘플) file [10] esniper 2009-03-14 98803
24 도서자료실 [리버스엔지니어링] 2009년 강컴 상반기 네트워크/보안 부분 최고의 도서 1위 [8] esniper 2009-07-11 86814
23 도서자료실 [리버스엔지니어링] 올리디버거 v1.10 + 기본플러그인 file [2] esniper 2009-03-14 84891
22 도서자료실 [리버스엔지니어링] Binary Analysis file [2] 관리자 2009-03-16 84474
21 도서자료실 [리버스엔지니어링] 보안과 해킹 분야 - 판매량 1위 esniper 2009-03-11 83428
20 도서자료실 [리버스엔지니어링] Virtual Machine [2] 관리자 2009-03-16 82077
19 도서자료실 [리버스엔지니어링] AntiDebugging Source file 관리자 2009-03-16 81600
18 도서자료실 [리버스엔지니어링] Decompilers file 관리자 2009-03-16 81277
17 도서자료실 [리버스엔지니어링] Hex-editors file 관리자 2009-03-16 80484
16 도서자료실 [리버스엔지니어링] Rebuilder file 관리자 2009-03-16 80317
15 도서자료실 [리버스엔지니어링] System-Monitoring Tools file [2] 관리자 2009-03-16 80183
14 도서자료실 [리버스엔지니어링] 델파이 커뮤니티 연합세미나 발표자료 file 관리자 2009-03-26 80054
13 도서자료실 [리버스엔지니어링] Rootkit Detection file 관리자 2009-03-16 78925
12 도서자료실 [리버스엔지니어링] 컴퓨터프로그램보호법 2008년 2월 개정된 국가법령정보... esniper 2009-03-14 78905
11 도서자료실 [리버스엔지니어링] Network-Monitoring Tool file 관리자 2009-03-16 78799
10 도서자료실 [리버스엔지니어링] Memory Patch file 관리자 2009-03-16 78077
9 도서자료실 [리버스엔지니어링] IDA Pro 4.9 Freeware Version file 관리자 2009-03-16 77979
8 도서자료실 [리버스엔지니어링] FAQ : 가장 자주 하는 질문들을 모았습니다. 관리자 2009-03-14 77473
7 도서자료실 [리버스엔지니어링] 2009년 문화체육관광부 우수 학술도서 선정결과 공고 file [5] esniper 2009-07-16 76442

  • 이용약관
  • 개인정보취급방침
  • 사이트맵