어셈블리 코드로서, gdb로 오픈 시 형태가 다를 수 있음.
#1.
global main
section .text
main:
mov ebx, eax -------------- ebx에 eax의 주소값 복사 : *eax = 0xf7fbb808
mov ebx, 0xbffff098 -------- ebx에 0xbffff098 복사 : *ebx = 0xbffff098
mov dword [eax], 0x10 ---- eax의 주소값 안에 0x10 복사 : eax = 0x10 (0xf7fbb808 = 0x10)
mov ebx, dword [eax] ------ ebx에 eax의 주소값 안에 들어있는 값 복사 : *ebx = eax --> *ebx = 0x10
mov ebx, eax -------------- ebx에 eax의 주소값 복사 : ebx = 0xf7fbb808
#초기 주소값과 데이터
*eax = 0xf7fbb808
*ebx = 0x0
eax = 0xffffcd9c
ebx = Cannot access
mov
- 데이터 복사 명령어
- lea와의 차이 뒤에 기술.
- mov ebx, eax ---> ebx = 0x7fbb808
- mov ebx, [eax] --> ebx = 0xffffcd9c
#2.
global main
section .text
main:
mov eax, esp ---------- eax에 esp의 주소값 복사 : *eax = 0xffffccfc
sub esp, 8 ------------- esp의 주소에 8를 빼기연산 : *esp = 0xffffccf4
mov [eax], dword 1 ----- eax의 주소 안에 0x1 데이터를 복사 : eax = 0x1 ---> 0xffffccfc = 0x1
mov [eax-4], dword 2 --- eax의 주소에서 4를 뺀 주소 안(값)에 0x2 데이터를 복사
: [eax-4] = 0x2 ---> 0xffffccf8 = 0x2
sub [eax-4], dword 1 ---- eax의 주소에서 4를 뺀 주소 안에 0x1 데이터를 복사
: [eax-4] = 0x1 ---> 0xffffccf8 = 0x1
#초기 주소값과 데이터
*eax = 0xf7fbb808
*esp = 0xffffccfc
eax = 0xffffcd9c
[eax-4] = 0x00000000
#3.
section .text
main:
mov eax, 1 ------------ eax의 주소에 0x1 복사 : *eax = 0x1, eax = {cannot access}
mov ebx, 4 ------------ ebx의 주소에 0x4 복사 : *ebx = 0x4, ebx = {cannot access}
mov ecx, 7 ------------ ecx의 주소에 0x7 복사 : *ecx = 0x7, ecx = {cannot access}
lea eax, [eax+ecx] ---- eax의 주소에 *eax+*ecx의 주소값 : *eax = 0x8, eax = {cannot access}
lea ebx, [ebx*4] ------- ebx의 주소에 *ebx * 4 = 4*4 --> 0x10 복사 : *ebx = 0x10, ebx = {cannot access}
mov eax, [eax+ecx] --- eax(*1=?), ecx(*7=?) --> 0x1과 0x7에는 메모리가 접근 불가.(힙으로 추정)
에러 후 종료
mov eax ----------------
#초기 주소값과 데이터
(시작부터 복사해서 의미없음)
#4.
global main
section .text
main:
mov eax, 0x33 ------- eax의 주소에 0x33 복사 : *eax = 0x33
mov ebx, 0x55 ------- ebx의 주소에 0x55 복사 : *ebx = 0x55
mov ecx, 0x42 -------- ecx의 주소에 0x42 복사 : *ecx = 0x42
and eax, ebx --------- eax의 주소와 ebx의 주소를 and연산 : *eax = 0x11
or eax, ecx ----------- eax의 주소와 ecx의 주소를 or연산 : *eax = 0x53
xor eax, 0xac ---------- eax의 주소와 0xAC를 xor 연산 : *eax = 0xFF
+) and, or, xor 연산
1. and 연산 : 둘 모두 같아야 1
*eax = 0x33 = 0011 0011
*ebx = 0x55 = 0101 0101 and
-----------------------------------------
0001 0001 ----> 0x11
2. or 연산 : 둘 중 하나라도 1이면 1
*eax = 0x11 = 0001 0001
*ecx = 0x42 = 0100 0010 or
-----------------------------------------
0101 0011 ------> 0x53
3. xor 연산 : 둘이 서로 (무조건)달라야 1
*eax = 0x53 = 0101 0011
*0xAC = 10, 12= 1010 1100 xor
------------------------------------------
1111 1111 ----> 0xFF
#5.
global main
section .text
main:
mov eax, 2 ------- eax의 주소에 2를 복사 eflags=0x246
cmp eax, 2 ------- eax의 주소와 2를 비교 eflags=0x246
cmp eax, 1 ------- eax의 주소와 1을 비교 eflags=0x202
cmp eax, 3 ------- eax의 주소와 3을 비교 eflags=0x297
test eax, eax ------ eax의 주소와 eax의 주소를 and연산 eflags=0x202
mov eax, 0 ------- eax의 주소에 0 복사 eflags=0x202
test eax, eax ------ eax의 주소와 eax의 주소를 and 연산 eflags=0x246
+)
cmp : oper1 - oper2 ---> +,-,0 나올 수 있음.
EFLAGS Register
ex)202
0010 | 0000 | 0010 -----------> [IF]
OF DF IF TF | SF ZF 0 AF | 0 PF 1 CF
OF(Overflow Flag) : 연산의 결과 값이 Sign-bit(MSG)를 제외한 최대 허용 정수값보다 크거나,
최소 정수값보다 작으면 1이 된다. --> overflow check
DF(Direction Flag) : 문자열을 처리하는 명령(MOVS, CMPS, SCAS, LODS, STOPS)를 제어하는 플래그.
1이 되어 있으면 높은 주소에서 낮은 주소대로 처리, 0이면 낮은 주소에서
높은 주소로 처리한다. (assembly = STD : set(1), CLD : clear(0))
IF(Interrupt Flag) : 프로세스로부터 인터럽트가 발생하면 인터럽트 처리를 할 것인지 제어.
1이 되어 있으면 인터럽트 신호가 발생 시 인터럽트를 처리.
0인 경우는 인터럽트 신호 와도 반응안함.
TF(Trap Flag) : 디버깅 시 Single step mod 활성화 하였을 때 1이 된다.
명령 실행 시 TF를 세트하여 하나의 명령씩 프로그램을 수행 가능
SF(Sign Flag) : 최상위 bit의 결과와 같은 결과로 설정된다. Signed Integer로 사용되는 경우
SF가 0이면 양수, 1이면 음수를 나타낸다.
ZF(Zero Flag) : 산술 연산 결과가 0인 경우 1이 되고 아니면 리셋.
보통 값 비교에서 oper1 - oper2=0 (같음) 혹은 루프에서 1씩 차감하여
0이 되면 루프를 빠져나오게 하는 등의 방식으로 활용되는 플래그.
AF(Adjust Flag) : 산술연산 수행결과가 bit3 자리에 자리 올림이나 내림이 발생할 때 1이 됌.
10진법(BCD) 연산에 사용되는 플래그.
PF(Parity Flag) : 산술연산 수행결과가 하위 1Byte 중 1bit가 짝수면 1, 아니면 0이 된다.
CF(Carry Flag) : 산술연산 수행결과가 자리 올림이나 자리 내림이 발생할 때 1이 된다.
참고 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=no1rogue&logNo=30095428920
즉, 3번째 줄 cmp eax, 1 에서 eflags가 202가 나왔는데, 이는
0010 0000 0010 을 뜻하고, IF 하나만 세팅되었다는 것을 알 수 있다.
#6.
global main
section .text
main:
mov ecx, 0 ------------- ecx의 주소에 0 복사 : *ecx = 0
mov eax, ecx ----------- eax의 주소에 ecx의 주소 복사 : *eax = 0
inc ecx ------------------ ecx의 주소에 1 증가 : *ecx = 1
cmp ecx, 255 ----------- ecx의 주소에 255를 빼서 and연산 : *ecx - 255 != 0 ----> 1 != 255 [ZF = 0]
jne 0x8048067 ---------- 같지 않으면 0x8048067로 점프
ret