반응형
1. 리버싱 기초
리버싱(Reversing)은 한국어로 역공학이라고도 부른다.
01 어셈블리
- C/C++코드와 어셈블리 코드의 차이
- 한 가지 동작까지 세세하게 지정
C/C++코드 예
1 2 3 4 5 6 7 8 9 | void 물마심() { BOOL bOpen = 냉장고문오픈 (); if (bOpen) { 물을꺼냄(); 마심(); } } | cs |
어셈블리 코드 예
|
02 어셈블리의 명령 포맷
- 주로 IA-32를 사용
- 기본형태 : 명령어(옵코드, opcode) + 인자(오퍼랜드, operand 1~2)
03 레지스터 - 레지스터의 종류
- CPU가 사용하는 변수
레지스터 |
역할 |
EAX (Accumulator) |
각종 연산에 쓰임 가장 많이 쓰이는 변수 주로 리턴 값을 저장 |
EDX (data) |
각종 연산에 쓰이는 변수 |
ECX (Count) |
for 문에서 i의 역할 ECX는 미리 값을 정해놓고 0이 될 때까지 진행 변수로 사용해도 무방 |
EBX |
목적이 없는 레지스터 공간이 필요할 때 덤으로 사용 |
ESI, EDI (source Index, destination Index) |
문자열이나 각종 반복데이터를 처리 또는 메모리를 옮기는데 사용 |
ESP |
스택 포인터 |
EBP |
베이스 포인터 |
EIP |
인스트럭션 포인터 |
03 레지스터 - 레지스트리 단위
32bit |
16bit |
상위 8bit |
하위 8bit |
EAX |
AX |
AH |
AL |
EDX |
DX |
DH |
DL |
ECX |
CX |
CH |
CL |
EBX |
BX |
BH |
BL |
03 레지스터 - 사용 예
- Plus (c 코드) vs. PlusAsm (Asm 코드)
- 두 함수가 같은 값을 반환
|
04 외울 필요가 없는 어셈블리 명령어
- PUSH, POP (PUSHAD, POPAD)
- MOV : source를 가져옴
- LEA : source의 주소를 가져옴
- ADD
- SUB
- INT : 인터럽트 명령 (CPU가 잠깐 정지)
- CALL
- INC, DEC (i++, i--)
- AND, OR, XOR
- NOP
- CMP, JMP
05 리버스 엔지니어링에 필요한 스택
- 함수 프롤로그
- 스택 구조
06 함수의 호출 & 리턴 주소
- 메인 함수에서 HelloFunction 함수 호출
- LIFO 방식으로 스택을 삽입'
1 2 3 4 5 6 | main() { DWORD dwRet = HelloFunction(0x37, 0x48, 0x39); if (dwRet) // ......... } | cs |
함수 호출 시 스택 구성
ebp+0x16 |
116h |
39h |
ebp+0x12 |
112h |
|
ebp+0x8 |
108h |
37h |
ebp+0x4 |
104 |
RET주소 (ebp, esp가 여길 가르킴) |
ebp |
100h |
ebp |
|
|
|
|
|
|
|
|
|
반응형
'악성코드 분석' 카테고리의 다른 글
[리버싱] crackme0x00a WRITE UP (0) | 2018.10.27 |
---|---|
리버싱 기초 - Lena 듀토리얼 01번 풀이 (0) | 2018.09.01 |
1.5 리버싱 기초 - C 문법과 어셈블리어 (2) | 2018.08.25 |
1. 리버싱 기초(2) (3) | 2018.08.25 |