1. Hello World! 프로그램
#include "windows.h"#include "tchar.h"int _tmain(int argc, TCHAR *argv[]){MessageBox(NULL,L"Hello World!",L"www.reversecore.com",MB_OK);return 0;}// 릴리즈 모드로 빌드하기.c언어(HelloWorld.cpp) ---- <빌드> -----> 실행파일(HelloWorld.exe)// 기계어 ------ <디버거> ----> 어셈블리어2. 디버깅 시작// Immunity Debugger 사용
Code Window
Register Window
Dump Window
Stack Window
- 사용법
// Restart (ctrl+F2)
Step Into (F7) : CALL함수를 만나면, 함수 코드 내부로 따라 들어감.
Step Over (F8) : CALL함수를 만나면, 따라 들어가지 않고, 함수 자체를 실행.
Execute till Return (Ctrl+F9) : 함수 코드 내에서 RETN 명령어까지 실행(함수 탈출 목적)
Go to(Ctrl+G) : 원하는 주소로 이동
Comment (;) : comment 추가
Set/Reset Break Point (F2) : BP 설정/해제
Run (F9) : 실행(BP가 걸려있으면 그곳에서 실행이 정지됨)
Show the previous Cursor (-) : 직전 커서 위치를 다시 보여줌.
* EP(Entry Point)
// Windows 실행 파일(EXE, DLL, SYS)의 코드 시작점을 의미.
address Instruction Disassembled code comment
- address : 가상 메모리내의 주소
- instruction : cpu 명령어
- Disassembled code : OP code를 보기 쉽게 어셈블리로 변환한 코드 (OP code란 Operation Code)
- comment : 디버거에서 추가한 주석
* BP(Break Point)
- view -> Breakpoints // BP목록 보기(Alt+B)
3. main() 찾기
- 경험과 노하우를 통한,,
// push , push, call...~
call에는 메인함수의 주소가 들어있다.
- 문자열 검색 방법
// code window 부분에서 우클릭 -> Search for -> All referenced text strings -> 이동하고자 하는 문자열을 더블클릭
// 제대로 간지 확인법> dump window 에 ctrl+G -> push 뒤에 있는 주소 입력 (0040211c)
-> dump window보면 아스키에 helloworld!가 찍혀 있음.
- API 검색
// 우리가 사용한 MessageBox()를 이용해서 찾는 것.
// Search for -> All intermodular calls -> 원하는 것 더블클릭하면 이동
- 문자열 패치1 <원본문자열의 크기와 수정문자열의 크기가 같거나 작은 것>
만약,,, 크다면,,, 이거는 뒤에 있는 함수에 영향을 주기때문에 프로그램 에러가 발생.
// 바꾸고자 하는 문자열을 드래그 후 ctrl+E (문자열 패치)
// 문자열이 바뀐 것을 확인할 수 있다. 하지만 이건 임시적으로 바꾼 것이다.
따라서, Restart를 하면 처음 상태 그대로 문자열이 helloWorld가 나온다.
// 임시적인게 아니라 저장하고싶다??
저장하고자 하는 문자열 드래그 -> 우클릭 -> Copy to executable file
// hex파일에 드래그 된 부분 우클릭 -> save file
- 문자열패치2 <원본문자열보다 수정문자열이 크기가 더 큰 경우>
// 맨 밑에 널패딩으로 가득한 곳을 찾는다. 그 주소 00401810을 dump window에서 ctrl+G로 검색
// 검색해서 쓰고싶은 만큼 드래그 -> ctrl+E -> 문자열 입력.
// 아까 위에있던 원본 문자열 push하는 부분에서 주소값을 널패딩으로 가득했던..
내가 새로 입력한 문자열 주소로 바꾼다. 주소를 바꾸기 위해서는 바꾸고자하는 줄을 더블클릭해준다.
// 바꾸고, 그 부분에 BP를 추가하여 Run한다. 그럼 내가 바꾼 문자열로 실행되는 것을 볼 수 있다.
* 깨알용어정리
- VA(Virtual Address) : 프로세스의 가상 메모리
- OP code (Operation code) : cpu 명령어(바이트 code)
- PE(Portable Executable) : Windows 실행파일(EXE, DLL, SYS 등)
'리버싱 > 리버싱의 핵심원리' 카테고리의 다른 글
PE구조 헤더 (0) | 2019.03.20 |
---|---|
Reversing - 스택프레임 (0) | 2018.12.26 |
Reversing - 스택(Stack), abex' crackme #1 분석 (0) | 2018.12.13 |
Reversing - 바이트 오더링, IA-32 Register 기본 설명 (0) | 2018.12.13 |
Reversing - 시작<기본> (0) | 2018.12.08 |