ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Lenas Reversing for Newbies] 14
    Wargame/Lenas Reversing 2021. 2. 23. 19:34

    1. 프로그램 실행

    첨부된 DVDMenuStdio.exe를 실행해보자.

     

    실행파일

     

    실행화면

    위와 같이 30일 남았다는 알림 창이 나타난다. Enter Reg.Code 버튼을 클릭하면 다음과 같이 정보를 입력하라는 창이 나타난다.

     

    실행화면

    이전 문제들과 마찬가지로 프로그램이 정상적으로 등록된 것으로 인식하도록 코드를 패치해보자.

     

    2. Debugging(with OllyDbg)

    OllyDbg로 파일을 연 후, F9를 눌러 실행하여 Enter Registration Info 창에서 정보를 임의로 입력까지 해보자. Ok 버튼을 누르기 전에 어떤 지점에서 BP가 걸릴지 예측을 해보자. Lena는 KillTimer() API가 호출될 것이라는 예측하에 KillTimer() API에 BP를 설정하는데 MessageBox() API에 주목하여 디버깅을 진행해보겠다. 일단 Ok 버튼을 누르면 다음과 같은 메시지 박스가 나타난다.

     

    메시지 박스

    일단 Ctrl+N을 통해 MessageBox가 호출되는 모든 부분에 BP를 설정하고 F9를 눌러 다시 똑같은 작업을 수행해보면 아래와 같이 BP에 적중한다.

     

    BP 적중

    근데 위의 메시지 박스가 포함된 함수에서는 실패했을 때 나타나는 처리를 담당할 뿐, 따로 조건에 따라 성공과 실패가 갈리는 코드는 보이지 않는다. 스크롤을 올려 함수의 시작 부근으로 커서를 옮겨보자.

     

    함수 시작부분

    주소 005B5F7B에서 호출되는 것을 확인할 수 있다. 해당 주소로 이동해보자.

     

    디버깅

    해당 부분도 마땅히 다른 옵션이 없는 것 같다. 함수의 시작 부분에는 호출되는 주소가 무수히 많으므로 Call Stack을 이용해 어느 주소에서 호출되었는지 알아보자.

     

    콜 스택

    앞의 두 부분에서는 이미 "The registration code seems to be not..."이라는 문자열이 넘겨지므로 체크 표시한 부분으로 이동해보자.

     

    디버깅

    빨간색 동그라미 표시한 부분을 보면 알맞게 잘 찾아온 것 같다. 이때 파란색 동그라미 표시한 부분들을 살펴보면 차례대로 EAX 값을 특정 상수와 CMP 하고 그 뒤에 conditional jump가 이어진다. "Thank you for your support!..."라는 문자열이 argument로 넘어가기 위해서는 EAX가 4여야 할 것 같다. 또한 CMP 명령어는 conditional jump로 넘어온 직후 수행되는 연속적인 형태로 코드가 구성되어 있는데, 가장 상단부로 가면 다음과 같은 코드를 볼 수 있다.

     

    디버깅

    BP를 설정한 부분에서 함수가 시작되며, 체크표시한 부분에 최초로 EAX 값을 세팅한다. 이후 동그라미 친 부분을 시작으로 계속 CMP EAX, ... 명령과 conditional jump 명령어가 반복된다. 그렇다면 체크 표시한 부분을 단순히 MOV EAX, 4로 패치하면 될 것 같지만 그렇게 할 경우 5바이트 명령어가 되므로 이어지는 PUSH EBX, PUSH ESI 명령어가 덮어씌워진다. 리버싱 핵심원리 20장 내용인 인라인 패치를 이용해 해결해보자. 체크 표시한 부분을 JMP (code cave address)로 수정하고, code cave address에 MOV EAX, 4 / PUSH EBX / PUSH ESI / JMP (원래 다음 실행되어야 할 address)를 작성하자.

     

    그전에 먼저 code cave address로 적합한 곳을 판단하기 위해 PEView로 파일을 열어보자.

     

    Alignment

    섹션과 파일 alignment는 1000 byte임을 확인하였다.

     

    .text section

    코드 영역의 크기는 001E37C0이다. .text 섹션에서 코드가 끝나는 부분을 확인해보자.

     

    .text section

    위와 같이 1E47C0에서 코드가 끝나지만 file alignment에 의해 1E5000 까지는 메모리에 올라갈 것으로 보인다. 파란색 체크 표시한 부분은 RVA로 001E47E0이므로 ImageBase 값을 더한 005E47E0 주소로 OllyDbg에서 이동해보자.

     

    코드 영역 끝부분

     

    체크 표시한 부분에 code cave 코드를 작성해보자.

     

    코드 작성

     

    이제 F9를 눌러 실행해보자. 그런데 자꾸 함수의 시작 부분 BP에 걸리고 MessageBeep 소리만 나고 진행이 되지 않는다. EAX가 4로 세팅되고 아래 표기한 부분에서 무언가 다시 EAX 값을 복원하는 듯 하다.

     

    디버깅

    아까 살펴보았던 CMP + Conditional Jmp 명령의 끝부분을 살펴보면 마지막으로 CMP EAX, 0B를 하는 것을 확인할 수 있는데 EAX를 0B로 세팅한다면 비록 "Thank you for your support!..."라는 문자열을 지나쳐 가지만 앞의 모든 등록 실패 조건들도 우회할 수 있을 것이다.

     

    마지막 CMP

    code cave의 코드를 MOV EAX, 0B로 수정해보면 정상적으로 패치가 이루어져 shareware 윈도우가 나타나지 않는다.

     

    3. Comment

    리버싱핵심원리 책에서 나온 Inline Patch 실전 연습을 해볼 수 있는 문제였다. Lenas 강의에서는 code cave를 작성할 적당한 주소를 찾아서 패치를 하는데 그 주소가 적당한지 검증하는 과정이 필요하다고 생각해 해당 부분을 글에 정리해보았다. 만약 메모리 상에서 코드를 패치해도 파일 상태일 때 text section을 벗어나는 경우라면 정상적으로 작동하지 않을 것이다.

    반응형

    'Wargame > Lenas Reversing' 카테고리의 다른 글

    [Lenas Reversing for Newbies] 16  (0) 2021.03.08
    [Lenas Reversing for Newbies] 15  (0) 2021.02.26
    [Lenas Reversing for Newbies] 13  (0) 2021.02.20
    [Lenas Reversing for Newbies] 12  (0) 2021.02.18
    [Lenas Reversing for Newbies] 11  (0) 2021.02.09

    댓글

Designed by Tistory.