리버싱 핵심원리 1부 10장 정리
Note
본 게시글의 내용은 리버싱 핵심원리를 보며 복습 겸 정리하였습니다.
책의 내용과 일부 상이할 수 있고, 이해를 돕기 위해 강좌 형식의 말투와 적절한(?) 예시를 추가하였습니다.
본 게시글에서 사용되는 소스 코드와 파일, 프로그램은 리버싱 핵심원리에서 제공하는 파일과 언급되는 것들을 기반으로 하며, 일부 상이할 수 있습니다.
Part10 Tut.ReverseMe
리버싱 초보자를 위해 Lena(외국인임)라는 사람이 리버싱 연습 프로그램과 강좌를 공개하고 있습니다. tuts4you에서 확인하실 수 있습니다.
아무튼 위 이미지는 그 사람의 프로그램 중 하나인데요 목표는 아래와 같습니다.
- ㅈ같은 잔소리 창 없애기
- 등록 코드 찾기
SmartCheck라는 프로그램을 사용하라는게 이미지에 대놓고 보이는데요, 일단 저 프로그램을 구하는 게 힘들고(1) 책에선 디버거를 사용하고 있기 때문에 본 게시글도 디버거로 진행하겠습니다.
- 기껏 찾아서 실행해봤는데 호환성 문제인지 잘 안 됨. 그리고 어떻게 사용하는 지 몰1루
메시지 박스 제거
프로그램을 첫 실행할 때와 Nag? 라는 버튼을 눌렀을 때 위 메시지 박스가 나타납니다. 이 메시지 박스를 제거해야 합니다.
디버거로 프로그램을 불러오면 ThunRTMain
을 확인할 수 있습니다. 맞습니다. 이 프로그램은 VB로 개발되었습니다.
VB에서 메시지 박스는 rtcMsgBox를 호출합니다. 이미지 1-3과 같이 마우스 우클릭 후 모든 모듈에서 호출되는 함수를 찾는 기능을 찾아 클릭해주세요.
msgbox
를 검색하면 rtcMsgBox
가 4개나 호출되는 걸 확인할 수 있습니다.
마우스 우클릭을 하시면 "Set Breakpoint on all commands"라는 메뉴 아이템을 확인할 수 있습니다. 이 메뉴 아이템을 클릭하면 rtcMsgBox
를 사용하는 모든 명령에 BP(BreakPoint)를 설치(설정)할 수 있습니다.
설치한 후 F9 키를 눌러 프로그램을 실행해주세요.
위로 조금 스크롤하면 이미지 1-2에 있는 메시지 박스의 내용을 확인할 수 있습니다.
여기서 F9 키를 눌러 실행하면 이미지 1-2에 있는 메시지 박스를 볼 수 있고, 확인 버튼을 누르면 이미지 1-1에 있는 창이 나타납니다. Nag? 버튼을 누르면 이미지 1-2의 메시지 박스가 또 다시 나타납니다. 같은 메시지 박스를 출력하기 때문에 한 군데만 수정하면 될 것 같습니다.
위로 조금 스크롤하면 스택 프레임의 구조를 확인할 수 있습니다. rtcMsgBox
는 함수 내부에 속해있는 코드로군요. 즉, 이 함수가 호출되지 않도록 호출하는 곳에가서 점프를 해버리거나 이 함수에서 그냥 리턴해버리면 될 것 같습니다. 그러면 메시지 박스가 나타나지 않을겁니다.
그냥 리턴하는 방법이 간단하겠죠? 다만 리턴할 때 함수에 전달된 매개변수의 크기만큼 ret N
을 해야합니다. 이 N을 알아내봅시다.
Call Stack 탭으로 이동해서 0x402C17
을 추적해봅시다.
7401E5A9
라는 수상한 주소가 보입니다. 저기로 이동해봅시다.
아하! 7401E5A9
는 복귀 주소로군요. 이전에 있는 call eax
명령에 의해 402C17
의 함수로 온 것 같습니다.
call eax
명령이 있는 곳에 BP를 설치하고 Ctrl+F2 를 눌러 다시 실행해봅시다.
다시 실행하고 와보니 eax
에 402656
이라는 값이 저장되어 있습니다. 주소 같아보이죠? 저 주소로 이동해봅시다.
찾았다 십새기!
명령을 잘 보시면 402C17
로 점프(jmp
)하라는 명령이 있습니다.
자, 정리를 해보면 7401E5A7
에 있는 call eax
명령에 의해 402C17
로 이동하네요. 즉, 이 명령의 호출 전과 호출 후의 스택 차이를 계산하면 전달되는 매개변수의 크기를 알 수 있습니다. 다시 실행하고 계산해볼까요?
다시 실행해보니 19FAB8
- 19FAB4
= 4
, 즉 크기는 4를 갖는군요.
메시지 박스 출력을 제거하는 데 성공했습니다. 이제 등록 코드를 알아내봅시다.
등록 코드
등록 코드는 어떻게 찾을까요? 일단 아무 값이나 입력하고 Register me! 버튼을 눌러봅시다.
등록 코드가 틀렸다는 메시지 박스가 나타나네요. "Sorry! Wrong registration code !"
라는 문자열을 디버거에서 일단 찾아봅시다.
ㅗㅜㅑ 문자열 검색을 하면 뭐가 막 나타납니다.
그런데 프로그램에서 못보던 문자열인 I'mlena151
이라는 값이 보입니다? 왠지 등록 코드같아 보이지 않나요...? 한 번 입력하고 확인해봅시다.
허무할 정도로 등록 코드를 빨리 찾았습니다.