1: OllyDbg + helloworld.exe
- OllyDbg : 32비트 바이너리 코드 디버깅 툴
- 디버깅 : 동적 분석 -> 프로그램 실행하면서 분석하는 방법
- *디컴파일 : 정적 분석 -> 프로그램 실행X. 바이너리 코드를 어셈블리어나 자바 등의 고급언어로 변환하여 흐름을 분석
OllyDbg 화면
1: 주소창
2: 기계어
3: 어셈블리어
1: Code Window
2: Register Window
3: Dump Window (메모리 덤프=>주소, HEX Dump, ASCII)
4: Stack Window (스택 주소, 값, comment)
https://iforint.tistory.com/43?category=1134087
ollydbg :: 02 용도 및 사용법
0. 용도 OllyDbg : 개발한 Oleh Yuschuk 의 이름을 딴, 바이너리 코드 분석을 위한 x86 디버거이다. 소스 코드가 없을 때 유용하게 사용된다. - 레지스터 추적 - 함수, API 호출 - Switch 문, table, 상수, 문자열
iforint.tistory.com
스탭 별 명령어(단축키)
1) 40270C 함수 따라가기
단축키 | 명령어 | 설명 |
Ctrl + F2 | Restart | 처음부터 디버깅 시작 (현재 프로세스 종료하고 재실행) |
F7 | Step Into | 하나의 OP코드(CPU명령어) 실행 (함수 내부로 들어감) |
F8 | Step Over | 하나의 OP코드(CPU명령어) 실행 (함수 안 들어가고 걍 실행) |
Ctrl + F9 | Execution till Return | 함수 코드 내에서 RETN 명령어까지 실행 (그 후 F7,8 누르면 함수 탈출) |
HelloWorld.exe 돌아다니기
▷ 파일 동작
Hello World! 메시지 박스를 출력하고 있음 버튼은 "확인" 버튼 하나 창 제목은 "www.reversecore.com" |
- 소스 코드
#include "windows.h"
#include "tchar.h"
int _tmail(int argc, TCHAR *argv[])
{
MessageBox(NULL,
L"Hello World!",
L"www.reversecore.com",
MB_OK);
return 0;
}
용어
1) VA: 프로세스의 가상 메모리
2) Stub Code: 컴파일러가 임의로 추가시킨 코드로, EP 코드 영역에 추가된 Stub Code는 Startup Code라고도 부름
개발 도구의 버전이나 종류에 따라 모습이 다름
▷ main 함수 찾기
1) EP (Entry Point)
EP 코드: 들어가자마자 만나는 코드 HelloWorld.exe의 실행 시작 주소 => 4011A0 |
CALL: 함수 호출 (40270C 함수 호출) |
- F7 누르고 함수 내부로 들어감
2) 40270C 함수
어쩌구 저쩌구 Stub Code 한 바가지 |
빨간색 글씨: 코드에서 호출되는 API 함수 이름 (소스코드에 쓴 적 없는데도 있음 -> 컴파일러가 씀 == Stub Code) |
- Ctrl + F9로 RTRN 명령어까지 한번에 가기
- F7,8로 함수 나가기
40270C 함수 탈출하여 다음 주소인 4011A5에 도착 |
- F7 혹은 8로 40104F 주소로 점프
3) 40104F로 점프
- F7로 쭉 가다가 401056에서 402524 함수 호출해보기
Stub Code |
- Ctrl + F9로 RETN 명령어까지 슝
- F7로 나옴
402524 함수에서 나온 바로 다음 주소인 40105B 주소에서 F7 혹은 8로 쭉 내려오다가 40109F 주소에서 4010A5 주소로 점프 4010A5 주소에서 F7 혹은 8로 4010A7로 이동 |
- F7로 4024F4 함수 호출
4024F4 함수 내부 (RETN에 화살표 무시하십시오..) |
F7로 이동하다가 402509 주소에서 뭔가... 뭔가를 호출 |
영 좋지 못한 곳에 온 느낌 |
- Ctrl + F9 눌러 RTRN 명령어로 이동
- F7 혹은 8 눌러서 탈출
- 영 좋지 못한 함수(?) 호출한 주소의 다음 주소에서 Ctrl + F9 눌러서 다시 리턴 명령어까지 이동
4010A7 주소의 다음인 4010AC 주소로 이동함 |
F7로 내려오다가 4010AF 주소에서 4010B9 주소로 점프(?) |
4010B9 에서 F7을 눌러 402367 함수를 호출 |
402367 함수 내부 |
주석(Comment) 부분에 빨간 글씨가 쓰여있는 주소는 Call 명령이 있어도 일단 넘어감(Stub Code) KERNEL32 : 윈도우 시스템의 기본적인 기능을 사용하기 위한 API 함수를 제공 |
F8로 쭉 지나감 |
4015EA 함수를 호출하고 있는 402434 주소를 만남 |
- F7로 4015EA 함수 내부로 들어감
뭔가 엄청 저장하고 호출하는 중 |
401629까지 갔다가 길 잃음 |
- Ctrl + F2 눌러서 리셋
- 다시.... 다시 401629까지 감..
- 현재까지 방문한 곳
- Ctrl + G 단축키로 401F57 주소로 이동(Go to)
- main 함수는 없는 것 같아서 일단 402434 주소의 다음 주소인 402439로 나옴
402439 주소에서 아래로 한 칸 내려와 40243F 주소에서 401F57 함수 호출 |
Stub Code가 한 바가지... |
- 뭐 없어서 Ctrl + F9로 리턴까지 -> 402444 주소로 나옴
- 그 뒤로도 401F57이 몇 번 더 호출됨
- 몇 번 더 F8로 내려오다가 40247C 주소 도착
4027C 주소에서 4027F4 함수 호출 |
- F8로 쭉 내려옴
40281C 주소에 도착. 40304C 함수 호출 중 F7로 들어가봄 |
- 이쪽 CALL에서도 메인 함수는 호출하지 않고 있음..
- 40247C 주소의 다음 차례인 402481 주소로 나와 다음 함수 호출을 찾아 내려감
F7을 눌러 402490 주소가 호출하는 401FD2 함수로 이동 |
- 마찬가지로 원하는 데이터는 없음
- 402490의 다음 주소인 402495 주소로 나와 다음 주소로 이동함
F7을 눌러 403600 주소로 이동 |
- 메인 없음
- 4024A9 주소의 다음 주소인 4024AE로 나와 다음 탐색
- .....하다가 402367 쪽엔 없는 것 같아서 4010B9의 다음 주소인 4010BE부터 다시 탐색 시작..
- 하다가!!!! 401144 주소에서 호출 중인 401000 주소에서 MessageBoxW() api의 호출 코드를 발견
소스코드에서 설정한 데이터를 볼 수 있음 |
- 401000 함수 == main() 함수
(TRPG의 낭만)
MOV EDI ,EDI
MOV EAX ,DWORD PTR DS:[40A004]
MOV EBX ,FFFF0000
MOV ESI , DWORD PTR SS:[EBP-4]
PUSH EBP
PUSH EBX
PUSH EDI
PUSH ESI
PUSH 14
POP ECX
SUB ESP ,10
CMP EAX, EDI
CMP WORD PTR DS:[EAX+400018] ,CX
INC EAX
JE SHORT HelloWor.0040273E
NOT EAX
JMP SHORT HelloWor.0040279E
LEA EAX, DWORD PTR SS:[EBP-8]
CALL DWORD PTR DS:[<&KERNEL32.어쩌구>]
XOR ESI ,EAX
AND DWORD PTR SS:[EBP-1C] ,0
JNZ SHORT HelloWor.004010A1
JBE SHORT HelloWor.004010A1
SETNE CL
SETE AL
TEST EAX ,EAX
INT3
JE HelloWor.004024EF
RETN
RETN 0C