[Reversing] 리버싱 핵심원리 [1]. Hello Reversing
내용 : Hello Reversing! 의 문자열이 담긴 MessageBox를 출력하는 C++ 코드를 Ollydbg로 분석하고, main 함수 시작점 찾기
[c++ 코드 전문]
1
2
3
4
5
6
7
8
|
#include "windows.h"
#include "tchar.h"
int _tmain(int argc, TCHAR* argv[])
{
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
위의 코드를 Visual Studio에서 작성시 Release모드로 컴파일해야 한다.
그렇지 않으면 초보자 입장에서 해석하기 어려운 어셈블리 형태로 컴파일이 된다,
자세히는 모르겠지만.. 패킹? 뭐 이런게 되서 어렵다고 본 것 같다.
다음으로 ollydbg를 관리자 권한으로 열어주고 F3을 눌러 앞서 만든 helloReversing.exe파일을 열어준다.
이러면 무언가 복잡한 화면이 나오는데, 왼쪽 상단부터 오른쪽으로
코드영역 --> 레지스터 영역 --> 덤프 영역 --> 스택 영역 이다.
코드영역은 기본적인 disassembly code를 표시하여 각종 coment, label을 보여주며 코드를 분석하여 loop, jump 위치 등의 정보를 표시한다.
레지스터 영역은 CPU register값을 실시간으로 표시하며 특정 register들은 수정도 가능하다고 한다.
Dump 영역은 프로세스에서 원하는 memory 주소 위치를 HEX와 Ascii/Unicode 값으로 표시하고 수정도 가능하다.
스택 영역은 ESP register가 가리키는 프로세스 stack memory를 실시간으로 표시하고 수정도 가능하다.
EP [Entry Point]
Ep는 windows 실행파일의 코드 시작점을 의미한다. 프로그램이 실행될 때 CPU에 의해 가장 먼저 실행되는 코드 시작위치이다.
위 그림에선 00B7126F가 EP이다.
main 함수 시작점 찾기
1. 단순무식하게 F7연타로 함수내에서 호출하는 API인 MessageBox 부분을 찾는다.
2. 코드영역에서 오른쪽 마우스 클릭 -> SearchFor -> Name in all module에서 나온 모든 API이름 중 MessageBoxA [main 함수 내부에서 호출함] 을 검색 및 BP걸기
3. 코드영역에서 오른쪽 마우스 클릭 -> SearchFor -> Allreferenced text string에서 일치하는 텍스트 문자열 찾기
이를 타고 들어가면 MessageBox 를 호출하는 부분이 나오게 된다.
다음 글은 이 MessageBox에서 출력하는 문자열을 패치 [바꿔 치기] 하는 방법을 작성한다.
느낀점
아직 메모리/ 레지스터 구조 및 어셈블리어에 대한 파악을 기초적으로 하고 있어, main함수 찾아들어가기까지 꽤 오랜시간 걸렸으나, 찾고 나서 더욱 흥미를 붙일 수 있었다.