툴은 Ollydebugger를 사용한다.(www.ollydbg.de)
기본적으로 어셈블리 언어를 알고 시작하는 편이 편하다.
먼저 ollydebugger에 나타나는 레지스터 정보를 살펴보자
범용레지스터
EAX
|
곱셈과 나눗셈 명령에서 자동으로 사용되고 함수의 리턴값이 저장되는 용도로도 사용된다.
|
EBX
|
ESI나 EDI와 결합하여 인덱스에 사용된다
|
ECX
|
반복 명령어 사용시 반복 카운터로 사용된다. ECX 레지스터에 반복할 횟수를 지정해 놓고 반복 작업을 수행하게 된다.
|
EDX
|
EAX와 같이 쓰이며 부호확장명령 등에 쓰인다
|
ESI
|
데이터 복사나 조작시 Source Data의 주소가 저장된다. ESI 레지스터가 가리키는 주소의 데이터를 EDI 레지스터가 가리키는 주소로 복사하는 용도로 많이 사용된다.
|
EDI
|
복사 작업시 Destination의 주소가 저장된다. 주로 ESI 레지스터가 가리키는 주소의 데이터가 복사된다.
|
ESP
|
스택 프레임의 끝지점 주소가 저장 PUSH, POP에 따라서 4byte씩 변함
|
EBP
|
스택 프레이의 시작지점 주소가 저장 현재 사용되는 스택 프레임이 소멸되지 않는 동안 EBP값은 변하지 않는다 소멸시 이전 사용 스택 프레임을 가르킨다
|
※ EAX,EBX,ECX 등은 32bit, 16bit, 8bit로 사용할 수 있는데, EAX를 16bit로 사용하면 AX, 8bit은AH,AL로 사용 가능하다.
상위 8bit은 H(high)가 붙고 하위 8bit은 L(low)가 붙는 것이다.
※ ESI,EDI,EBP,ESP는 32bit, 16bit로 사용 가능하다.(사용방법 위와 동일)
명령포인터
EIP
|
다음에 실행해야 할 명령어가 존재하는 메모리 주소가 저장된다
|
세그먼트 레지스터
CS
|
실행가능한 명령어가 존재하는 세그먼트의 오프셋이 저장된다
|
DS
|
프로그램에서 사용되는 데이터가 존재하는 세그먼트의 오프셋이 저장된다
|
SS
|
스택이 존재하는 세그먼트의 오프셋이 저장된다
|
플래그 레지스터
CF(Carry)
|
carry flag, 부호없는 연산 결과가 용량보다 클 때 1된다
|
ZF(Zero)
|
연산결과가 0일 때 1로 세트된다
|
OF(overflow flag)
|
부호 있는 연산 결과가 용량보다 클 때 1된다
|
SF(Sign)
|
연산 결과가 음수가 되었을 때 1된다. 연산결과가 양수되면 0된다
|
DF(Direction)
|
문자열 처리에서 연속되는 문자열의 처리방향에 따라 세트된다.
|