올리디버거 메인 화면 구성
Code Window | disassembly code 표시 코드 분석하여 loop, jump 위치 등의 정보 표시 |
Register Window | CPU register 값을 실시간으로 표시 |
Dump Window | 프로세스에서 원하는 memory 주소 위치를 Hex, ASCII/ 유니코드 값으로 표시 |
Stack Window | ESP register가 가리키는 프로세스 stack memory를 실시간 표시 |
EP(Entry Point): 디버거가 멈춘 곳, windows 실행 파일의 코드 시작점. 프로그램이 실행될 때 CPU에 의해 가장 먼저 실행되는 코드 시작 위치
Address | 프로세스의 가상 메모리 내의 주소 |
Instruction | IA32(or x86) CPU 명령어 |
Disassembled code | OP code 보기 쉽게 어셈블리로 변환 |
comment | 디버거에서 추가한 주석 |
예시
Address | Instruction | Disassembled code | comment |
004011A0 | E8 67150000 | CALL 0040270C | 0040270C(40270C 주소의 함수를 호출) |
004011A5 | E9A5FEFFFF | JMP 0040104F | 0040104F(40104F 주소로 점프 |
=> "40270C 주소의 함수를 호출(CALL)한 후 40104F 주소로 점프(JMP)하라"
OllyDbg 기본 명령어
명령어 | 단축키 | 설명 |
Restart | Ctrl + F2 | 다시 처음부터 디버깅 시작 |
Step Into | F7 | 하나의 OP code 실행(Call에서 함수 내부로) |
Step Over | F8 | 하나의 OP code실행(Call 에서 함수 실행) |
Execute till Return | Ctrl + F9 | 함수 코드 내에서 RETN 명령어까지 실행 |
Main 함수 찾는게 중요 main() 함수 아닐 시 F8로 넘어감 or F7로 들어가버렸으면 Ctrl + F9로 함수 탈출
디버거 동작 명령
명령어 | 단축키 | 설명 |
Go to | Ctrl + G | 원하는 주소로 이동 |
Execute till Cursor | F4 | cursor 위치까지 실행 |
Comment | ; | Comment 추가 |
User-defined comment | 마우스 우측 메뉴 Search for User-defined commnet | |
Label | : | Label 추가 |
User-defined label | 마우스 우측 메뉴 Search for User-defined label | |
Set/Reset BreakPoint | F2 | BP 설정/해제 |
Run | F9 | 실행 |
Show the current EIP | * | 현재 EIP 위치를 보여줌 |
Show the previous Cursor | - | 직전 커서 위치 다시 보여줌 |
Preview CALL/JMP address | Enter | 커서가 CALL/JMP 등의 명령어에 위치해 있다면, 해당 주소로 따라가서 보여줌 |
베이스 캠프
디버거 재실행 시 EP 코드부터 시작하면 불편. 중간중간 중요한 포인트로 빠르게 가기 위해 캠프를 설치함. 어케 설치?
1) Goto 명령
2) BP 설치 : F2하고, F9함
3) 주석: 단축키로 주석달고, 찾아감
4) 레이블(Label): 주소에 이름 붙이는거. 직관적이게 되어서 디버깅시에 편리함
원하는 코드 빨리 찾기
프로그램의 기능이 명확한 경우에는 명령어 하나하나 실행하면서 원하는 위치를 찾아감( 코드 크기 小, 기능 명확할 時)
프로그램 내에서 사용되는 문자열 찾기: [마우스 우클릭] - [Search for] - [all referenced text strings]
API 검색 - 호출 코드에 BP: [마우스 우클릭] - [Search for] - [all intermodular calls]: windows프로그래밍에서 화면 출력시 Win32 API를 사용함. 프로그램 기능 보고 사용되었을 법한 API 호출 예상 후 찾기
API 검색 - API 코드에 직접 BP: [마우스 우클릭] - [Search for] - [Name inall modules]: 올리디버거에서 Packer/protector 사용하면 파일 구조 변경되어 API 호출 목록 확인 불가 이때 프로세스 메모리에 로딩된 라이브러리(DLL code)에 직접 BP 걸기
패치 실습
: 메시지 박스의 Hello World 문자열을 다른 문자열로 변경시키기
1) 문자열 버퍼 직접 수정
Goto명령으로 Helloworld 버퍼 있는 주소로 감. 주소 마우스로 선택 후 Ctrl + E 단축키로 Edit 다이얼로그 띄움. 유니코드 항복에 문자열 바꿔서 입력 .
단점: 기존 문자열 버퍼 크기 이상의 문자를 입력하기 어려움.
이렇게 패치하고 나면 메모리에 임시 작업해둔거라 프로세스 종료 시 내용 사라짐. 영구 보존하려면 별도의 실행 파일 저장 必.
2) 다른 메모리 영역에 새로운 문자열을 생성하여 전달
원본 문자열보다 더 긴 문자열로 하고 싶다
1번 방법 뒷 부분 널 패딩 영역에 새로운 패치 문자열 넣고(새로운 버퍼 구성) MessageBoxW()함수에다가 새로운 버퍼 주소 전달함
'공부해요 > 리버싱_핵심원리' 카테고리의 다른 글
7장. 스택 프레임 (1) | 2024.09.18 |
---|---|
5장. 스택 (0) | 2024.09.17 |
4장. IA-32 Register 기본 설명 (0) | 2024.09.11 |
3장. 리틀 엔디언 표기법 (0) | 2024.09.11 |
1장. 리버싱 스토리 (0) | 2024.09.11 |