콘텐츠로 이동

리버싱 핵심원리 1부 10장 정리

Note

본 게시글의 내용은 리버싱 핵심원리를 보며 복습 겸 정리하였습니다.

책의 내용과 일부 상이할 수 있고, 이해를 돕기 위해 강좌 형식의 말투와 적절한(?) 예시를 추가하였습니다.

본 게시글에서 사용되는 소스 코드와 파일, 프로그램은 리버싱 핵심원리에서 제공하는 파일과 언급되는 것들을 기반으로 하며, 일부 상이할 수 있습니다.

Part10 Tut.ReverseMe

IMAGE1-1
이미지 1-1

리버싱 초보자를 위해 Lena(외국인임)라는 사람이 리버싱 연습 프로그램과 강좌를 공개하고 있습니다. tuts4you에서 확인하실 수 있습니다.

아무튼 위 이미지는 그 사람의 프로그램 중 하나인데요 목표는 아래와 같습니다.

  1. ㅈ같은 잔소리 창 없애기
  2. 등록 코드 찾기

SmartCheck라는 프로그램을 사용하라는게 이미지에 대놓고 보이는데요, 일단 저 프로그램을 구하는 게 힘들고(1) 책에선 디버거를 사용하고 있기 때문에 본 게시글도 디버거로 진행하겠습니다.

  1. 기껏 찾아서 실행해봤는데 호환성 문제인지 잘 안 됨. 그리고 어떻게 사용하는 지 몰1루

메시지 박스 제거

IMAGE1-2
이미지 1-2

프로그램을 첫 실행할 때와 Nag? 라는 버튼을 눌렀을 때 위 메시지 박스가 나타납니다. 이 메시지 박스를 제거해야 합니다.

IMAGE1-3
이미지 1-3

디버거로 프로그램을 불러오면 ThunRTMain을 확인할 수 있습니다. 맞습니다. 이 프로그램은 VB로 개발되었습니다.

VB에서 메시지 박스는 rtcMsgBox를 호출합니다. 이미지 1-3과 같이 마우스 우클릭 후 모든 모듈에서 호출되는 함수를 찾는 기능을 찾아 클릭해주세요.

IMAGE1-4
이미지 1-4

msgbox를 검색하면 rtcMsgBox가 4개나 호출되는 걸 확인할 수 있습니다.

IMAGE1-5
이미지 1-5

마우스 우클릭을 하시면 "Set Breakpoint on all commands"라는 메뉴 아이템을 확인할 수 있습니다. 이 메뉴 아이템을 클릭하면 rtcMsgBox를 사용하는 모든 명령에 BP(BreakPoint)를 설치(설정)할 수 있습니다.

설치한 후 F9 키를 눌러 프로그램을 실행해주세요.

IMAGE1-6
이미지 1-6

위로 조금 스크롤하면 이미지 1-2에 있는 메시지 박스의 내용을 확인할 수 있습니다.

여기서 F9 키를 눌러 실행하면 이미지 1-2에 있는 메시지 박스를 볼 수 있고, 확인 버튼을 누르면 이미지 1-1에 있는 창이 나타납니다. Nag? 버튼을 누르면 이미지 1-2의 메시지 박스가 또 다시 나타납니다. 같은 메시지 박스를 출력하기 때문에 한 군데만 수정하면 될 것 같습니다.

IMAGE1-7
이미지 1-7

위로 조금 스크롤하면 스택 프레임의 구조를 확인할 수 있습니다. rtcMsgBox는 함수 내부에 속해있는 코드로군요. 즉, 이 함수가 호출되지 않도록 호출하는 곳에가서 점프를 해버리거나 이 함수에서 그냥 리턴해버리면 될 것 같습니다. 그러면 메시지 박스가 나타나지 않을겁니다.

그냥 리턴하는 방법이 간단하겠죠? 다만 리턴할 때 함수에 전달된 매개변수의 크기만큼 ret N을 해야합니다. 이 N을 알아내봅시다.

IMAGE1-8
이미지 1-8

Call Stack 탭으로 이동해서 0x402C17을 추적해봅시다.

7401E5A9라는 수상한 주소가 보입니다. 저기로 이동해봅시다.

IMAGE1-9
이미지 1-9

아하! 7401E5A9는 복귀 주소로군요. 이전에 있는 call eax 명령에 의해 402C17의 함수로 온 것 같습니다.

call eax 명령이 있는 곳에 BP를 설치하고 Ctrl+F2 를 눌러 다시 실행해봅시다.

IMAGE1-10
이미지 1-10

다시 실행하고 와보니 eax402656이라는 값이 저장되어 있습니다. 주소 같아보이죠? 저 주소로 이동해봅시다.

IMAGE1-11
이미지 1-11

찾았다 십새기!

명령을 잘 보시면 402C17로 점프(jmp)하라는 명령이 있습니다.

자, 정리를 해보면 7401E5A7에 있는 call eax 명령에 의해 402C17로 이동하네요. 즉, 이 명령의 호출 전과 호출 후의 스택 차이를 계산하면 전달되는 매개변수의 크기를 알 수 있습니다. 다시 실행하고 계산해볼까요?

다시 실행해보니 19FAB8 - 19FAB4 = 4, 즉 크기는 4를 갖는군요.

1
2
3
4
5
; 402C17에 있는 아래의 명령을
push ebp
mov ebp, esp
; 아래의 명령으로 변경
ret 4

메시지 박스 출력을 제거하는 데 성공했습니다. 이제 등록 코드를 알아내봅시다.

등록 코드

IMAGE1-12
이미지 1-12

등록 코드는 어떻게 찾을까요? 일단 아무 값이나 입력하고 Register me! 버튼을 눌러봅시다.

등록 코드가 틀렸다는 메시지 박스가 나타나네요. "Sorry! Wrong registration code !"라는 문자열을 디버거에서 일단 찾아봅시다.

IMAGE1-13
이미지 1-13

ㅗㅜㅑ 문자열 검색을 하면 뭐가 막 나타납니다.

그런데 프로그램에서 못보던 문자열인 I'mlena151이라는 값이 보입니다? 왠지 등록 코드같아 보이지 않나요...? 한 번 입력하고 확인해봅시다.

IMAGE1-14
이미지 1-14

허무할 정도로 등록 코드를 빨리 찾았습니다.