zj3t

email: euntaejang@gmail.com

Latest Posts

리버스 엔지니어링 전 필수암기

By 오후 8:48 ,

기억해야 할 레지스터와 그 쓰임!!

EAX: EAX 레지스터는 산술, 논리 연산을 수행하며 함수의 반환 값이 이 레지스터에 저장 된다. 함수의 반환 값이 EAX 레지스터에 저장되므로 호출 함수의 성공 여부, 실패 여부를 쉽게 파악할 수 있으며, 반환 값을 쉽게 얻어올 수 있다.

EBX: 메모리 주소를 저장하기 위한 용도로 사용.

ECX: ECX 레지스터는 카운터 레지스터이다. 주로 반복 명령어 사용시 반복 카운터로 사용 되며 ECX레지스터에 반복할 횟수를 지정하고, 반복 작업을 수행합니다.

EDX: EDX레지스터는 EAX레지스터와 같이 쓰이고, 부호 확장 명령 등에 쓰이고 큰수의 곱 셈 또는 나눗셈 등의 연산을 할 때 사용

EBP: EBP에는 스택 프레임의 시작 지점 주소(스택의 가장 윗 부분)가 저장. EBP 레지스터 는 현재 사용되는 스택프레임이 소멸되지 않는 이상 EBP 레지스터의 값은 변하지 않습니다.

ESP: ESP에는 스택 프레임의 끝 지점 주소(스택의 가장 아랫부분)가 저장되며, PUSH, POP 명령에 따라 ESP 값이 4바이트씩 변합니다.

ESI: 데이터를 조작하거나, 복사시에 소스 데이터의 주소가 저장됩니다.

EDI: 복사 시에 목적지의 주소가 저장됩니다.

EIP: -다음에 실행할 명령이 들어 있는 메모리의 번지를 가진다.
-CS 세그먼트 레지스터와 한 쌍이 되어 실행 번지를 참조
-CPU는 EIP 주소를 보고, 다음에 처리할 명령을 파악한다.
-직접적으로 사용자가 조작할 수 없는 레지스터이다.
(버퍼 오버플로우 공격에 사용되는 레지스터 이다.)

자주 사용되는 STATUS FLAG!!!
FLAG: 프로그램 실행중에 특정 상태가 성립했는지의 여부를 식별하기 위하여 조 사되는 데이터의 항목. 즉, 식별 또는 표시를 목적으로 하여 데이터에 붙여 지는 표시기(indicator)이며, 보통은 1비트가 사용된다.
CF(carry flag): 부호 없는 연산 결과가 용량보다 클 때 세트(1) 된다.
ZF(zero flag): 연산 결과가 0일 때 세트(1) 되고, 0이 아닐 때 해제(0) 된다.
SF(sign flag): 연산 결과, 최상위 비트가 1일 때(보수 표현으로 음수가 되었을 때) 세트(1)
되고, 0일 때 해체(0) 된다.
: 즉 연산 결과가 음수가 되었을 때 세트(1), 양수가 되었을 때 해제(0) 된다.
OF(overflow flag): 부호있는 연산 결과가 용량보다 클 때 세트(1)된다.
DF(direction flag): 문자열 처리에서 연속되는 문자열의 처리 방향에 따라 세트된다.
------------------------------------------------
자주 사용되는 어셈블러 명령!!
MOV EAX, ECX: ECX(상수가능) 값을 EAX에 저장
LEA EAX, ECX: ECX(항상 레지스터) 값을 EAX에 저장
ADD EAX, ECX: EAX += ECX
SUB EAX, ECX: EAX -= ECX
INC EAX: EAX++
DEC EAX: EAX--
CMP EAX, ECX: 값을 비교하여 플래그에 반영, EAX와 ECX가 같으면 ZF=1 다르면 ZF=0
TEST EAX, EAX: 값을 비교하여 플래그에 반영, EAX가 0이면 ZF=1 0이 아니면 ZF=0
JE(JZ) 04001000: ZF=1이면 04001000으로 점프
JNE(JNZ) 04001000: ZF=0이면 04001000으로 점프
JMP 04001000: 무조건 04001000으로 점프
CALL lstrcmpw: lstrcmpw를 호출
PUSH 00000001: 스택에 00000001를 저장
POP EAX: 스텍의 최상위 값을 꺼내어 EAX에 저장
--------------------------------------------------------------------

PUSH와 POP의 이해!!!
1.PUSH ECX: ECX에 들어있는 값을 스택에 저장
2.PUSH EAX: EAX에 들어있는 값을 스택에 PUSH
3.POP ECX: 스택에 들어있는 값을 POP(꺼내어) ECX에 저장
4.POP EAX: 스택에 들어있는 값을 POP하여 EAX에 저장
예를 들어 ECX에 100이 들어가 있다고 가정하고 EAX에 200이 들어가 있다고 가정하면
| |
=====
| | <-스택: 아래쪽부터 쌓았다고 생각
=====
| |
1번 수행 후
| |
=====
| |
=====
| 100 |
2번 수행 후
| |
=====
| 200 |
=====
| 100 |
3번 수행 후
| |
=====
| |
===== ECX:200(스택에 최상위에 있는 200값을 꺼내어 ECX에 저장)
| 100 |
4번 수행 후
| |
===== ECX:200
| |
===== EAX:100
| |

You Might Also Like

0 개의 댓글