지금부터 이루어지는 포스팅은 IA-32 Processor Architecture 기반입니다.
1.레지스터 - CPU 내부에 있는 8,16,32Bit 고속 저장소를 말하며 일반적으로 사용하고 있는
메모리 보다 데이터를 훨씬 빨리 Read ,Write 할 수 있음.
ㆍ범용 레지스터 (General-Purpose Register) : 8개
EAX, EBX, ECX, EDX, ESI, EDI레지스터는 우리 마음대로 쓸 수 있는 레지스터이다.
EAX : Accumulator Register. 곱셈, 나눗셈 명령에 쓰임.
EBX : Base Register.
ECX : Counter Register. 루프 카운터로 쓰임.
EDX : Data Register.
ESI : Source Index. 고속의 메모리 복사에 쓰임.
EDI : Destination Index. 고속의 메모리 복사에 쓰임.
ESP,EBP레지스터는 스택레지스터라고 불림.
ESP : Stack Pointer의 약자. 스택의 탑 가르킴.2개
EBP : Base Pointer. 고급 언어에서 사용하는 함수 파라미터와 지역변수를 가리키는 데 쓰일 것이
다. 일반적인 산술이나 데이터 전송에 쓰여서는 안됨.
ㆍ세그먼트 레지스터 (Segment Register) : 6개
프로그램 수행에 필요한 내용들이 미리 메모리에 할당되어 있는 데 그곳의 주소를 갖고 있음.
-세그먼트 레지스터는 자세히 알 필요 없음
ㆍEIP Register = 명령 포인터 (Instruction Pointer) : 다음에 수행되어야 할 명령문의 주소
를 갖고 있게 된다. (우리가 흔히 알고 있는 PC=Program Counter와 같음.)
ㆍEFLAGS Register : EFLAGS의 각각의 비트는 1(set)이 되거나 0(clear)이 될 수 있
음. 예를 들어, Sign Flag라는 비트는 계산 결과가 음수인지 아 닌지를 표
현해줌.
즉, 이 레지스터를 통해 여러 가지 상태를 알 수 있다. (음수인 지 양수인
지, 오버플로우가 발생하였는지 등)
2.바이트 순서
-Little-Endian (리틀 인디언) : 주소의 낮은 자릿수를 기록하고, 주소값이 증가할수록 높은
자릿수를 기록하는 것. 인텔 계열이 주로 사용
Ex) 0x12345678 => 78 56 34 12
-Big Endian (빅 인디언) : 정수로 정렬된 큰 수에 대한 비교를 메모리의 작은 주소부터 큰 주
소 방향으로 읽으면서 바로 비교할 수 있어 더 빨리 할 수 있으며,
모든 정수와 문자열을 같은 순서 방향으로 읽을 수 있다는 장점 있
음.Motorola나 Sun, Sparc등 RISC에서 사용.
Ex) 0x12345678 => 12 34 56 78
3.Calling Conventions
-스택에 파라미터를 어떠한 순서로 넣을 것인가?
전달되어진 파라미터를 어느 곳에서 해제할 것인가?
이 두가지에 따라 여러 가지 방식이 있는데 이를 콜링 컨벤션이라고 함.
_cdecl
파라미터 전달 방향: 오른쪽->왼쪽
파라미터 해제 : 호출한 쪽(Caller)
_stdcall
파라미터 전달 방향 : 오른쪽 ->왼쪽
파라미터 해제 : 호출 당항 쪽(Callee)
_fastcall
처음 두 개까지의 파라미터는 스택을 사용하지 않고 ECX와 EDX레지스터 사용.
파라미터 전달 방향 : 오른쪽->왼쪽
파라미터 해제 : 호출 당한 쪽(Callee)
명령어1 | 명령어2 | 설명 | 부등호 조건 | Flag 조건 |
JA | JNBE | 크면 분기 ( 부호 없이 비교[unsigned] ) | OP1>OP2면 분기 | CF=0 & ZF=0 |
JAE | JNB | 크거나 같으면 분기 ( 부호 없이 비교[unsigned] ) | OP1≥OP2면 분기 | CF=0 | ZF=1 |
JB | JNAE | 작으면 분기 ( 부호 없이 비교[unsigned] ) | OP1<OP2면 분기 | CF=1 |
JBE | JNA | 작거나 같으면 분기 ( 부호 없이 비교[unsigned] ) | OP1≤OP2면 분기 | CF=1 | ZF=1 |
JG | JNLE | 크면 분기 ( 부호 있는 비교[signed] ) | OP1>OP2면 분기 | ZF=0&SF ==OF |
JGE | JNL | 크거나 같으면 분기 ( 부호 있는 비교[signed] ) | OP1≥OP2면 분기 | SF==OF |
JL | JNGE | 작으면 분기 ( 부호 있는 비교[signed] ) | OP1<OP2면 분기 | SF!=OF |
JLE | JNG | 작거나 같으면 분기 ( 부호 있는 비교[signed] ) | OP1≤OP2면 분기 | ZF==1|SF!=OF |
JE |
| 같으면 분기 | OP1=OP2면 분기 | ZF==1 |
JNE |
| 같지 않으면 분기 | OP1≠OP2면 분기 | ZF==0 |
JC |
| Carry Flag가 Set되면 분기 |
| CF==1 |
JNC |
| Carry Flag가 해제되어 있으면 분기 |
| CF==0 |
JO |
| Overflow가 Set되어 있으면 분기 |
| OF==1 |
JNO |
| Overflow가 해제되어 있으면 분기 |
| OF==0 |
JS |
| Sign Flag가 Set되어 있으면(음수이면) 분기 |
| SF==1 |
JNS |
| Sign Flag가 해제되어 있으면(양수이면) 분기 |
| SF==0 |
JZ |
| Zero Flag가 Set되어 있으면 분기 |
| ZF==1 |
JNZ |
| Zero Flag가 해제되어 있으면 분기 |
| ZF==0 |
JP |
| Parity Flag가 Set되어 있으면 분기 |
| PF==1 |
JNP |
| Parity Flag가 해제되어 있으면 분기 |
| PF==0 [출처] 리버싱 기초2 - 어셈블리언어 - 점프문 정리|작성자 초딩코딩 |
ADD oper1, oper2 - oper1에 oper2를 더한뒤 결과값을 oper1에 저장.
ex) add eax, 1000h <-eax = eax+0x1000
SUB oper1, oper2 - oper1에서 oper2를 빼고 결과 값을 oper1에 저장.
ex) mov eax, 5
sub eax, 5 <-결과는 0이됨.
MUL / IMUL oper - MUL은 부호 없는 곱셈 명령을 수행.
IMUL은 부호 있는 곱셈 명령을 수행.
EAX에 저장되어진 값과 oper을 곱한 결과를 아래와 같이 저장한다.
- 8비트 연산은 AX에 저장
16비트 연산은 DX:AX에 저장
32비트 연산은 EDX:EAX에 저장
->곱셈 결과가 두배가 되어 자리수를 넘어가기 때문에 곱셈을 하였을때 두배
크기의 공간에 저장됨. (자리수를 넘어가면 캐리 또는 오버플로우 발생.)
ADC oper1, oper2 - ADD와 유사하나 캐리 플래그가 이용됨.
oper1 = oper1 + (oper2 + 캐리 플래그)
캐리비트는 0으로 리셋됨.
ex) mov ebx, 5
mov eax, 0
stc <-CF=1(캐리 플래그)
sbb ebx, eax <-ebx=4
SBB oper1, oper2 - SUB와 유사하나 캐리플래그가 이용됨.
oper1 = oper1 - (oper2 + 캐리 플래그)
연산이 끝나면 캐리비트는 0으로 리셋됨.
INC oper - Increment
oper의 값이 1만큼 증가.
ex) mov eax, 1
inc eax <-eax의 값이 2로 값이 증가.
DEC oper - Decrement
oper의 값이 1만큼 감소.
ex) mov eax, 1
dec eax <-eax의 값이 0으로 감소.
STD - Set Direction.
DF를 1로 설정.
CLD - Clear Direction.
DF를 0으로 설정.
CMC - Complement Carry
캐리 플래그를 반전시킨다.
1이면 0, 0이면 1로 만든다.
STC - Set Carry
캐리 플래그를 1로 만든다.
CLC - Clear Carry
캐리 플래그를 0으로 만든다.
[출처] 리버싱 기초3 - 어셈블리 언어 - 기본 문법 1|작성자 초딩코딩
출처- http://blog.naver.com/coool219?Redirect=Log&logNo=60114153387
'CAT-Security > 미분류' 카테고리의 다른 글
[Defcon 21 ctf] policebox (0) | 2014.04.08 |
---|---|
Python 예외처리 (0) | 2014.01.09 |
MBR 덤프해서 16비트 어셈블리 코드로 보는방법 (0) | 2013.07.22 |
MBR (Master Boot Record) 정리 (0) | 2013.07.22 |
ASProtect 2.1 MUP 정리 (1) | 2013.06.18 |