18강
-JGE/JLE: JG/JL에 같은 경우도 포함
JGE: S=O 면 점프
JLE: S<> or Z=1
-JNGE = JL /JNLE = JG
-JO: Overflow 비트가 1이면
-JS: Sign 비트가 1이면
19강
P(parity): 페리티 플래그
parity?
동등성을 유지시키는 것
비트에서 1의 동등성을 유지시킴
-odd parity: 1의 개수를 홀수로 유지시킴
ex) 1100 p:1(parity까지 홀수개)
만약 비트가 오류가 나서 1000 ->1이 되면 1의 개수가 짝수가 되기 때문에 오류가 났다는 것을 알 수 있음
*intel: 홀수 패리티 사용, 하위 8bit에 대해서만 체크
cf) even parity: 짝수 페리티
*crc32: 파일을 체크하고 오류를 복구하는 방법
->parity를 응용함
A: 보조 캐리 플래그
하위 4bit에 대한 플래그, 이진화십진법
ex) 9+9 => 10의 자리에 캐리 발생 A 1
이진화십진법(BCD): 이진수 네 자리를 묶어 십진수 한 자리로 사용
20강
*adc: carry 값을 이용한 add, 올림까지 처리
mov eax, 0
add eax, 0
add eax, fffffff9 -> c 1
adc eax
mov dword ptr [402000], 18
mov dword ptr [402004], 20
mov eax, [402000] // 연산을 하려면 하나는 레지스터로 읽어와야 함
add eax, dword ptr [402004]
mov dword ptr [402008], eax
mov dword ptr [402000]
0000 0001 9000 0000
+ 0000 0001 9000 0000
adc->3 2000 0000(올림 처리)
add->2 2000 0000
*sbb: sub에서 빌림이 발생하는 경우까지 처리
0000 0002 2000 0000
0000 0001 9000 0000
-
0000 0000 9000 0000
빌림이 발생하면 c=1
21강 스택
-자료구조 중 하나, LIFO(Last In Fisrt Out) 구조
-Push / Pop
-마지막에 넣은 것 부터 pop
-프로그램이 실행될 때 OS가 할당해줌
-ESP 스택의 맨 위의 주소,
ex) push @ -> esp를 증가시키고 그 주소에 @를 넣는다.
push를 하면 4byte씩 증가, esp값도 4씩 감소
(스택은 데이터를 위로 쌓기 때문에)
-EBP: 스택의 베이스 주소
-함수 호출 시 실행하고 있는 함수 정보를 스택에 담고 호출한 함수 실행, 프레임 정보라고 함
ex)
f2
f1 실행이 끝나면 pop -> 다음 함수 실행
main
(stack)
22강 mul
-부호가 없는 정수에 대한 곱셈 계산
-32 * 32 = 64bit(8Byte) -> 8바이트 연산 결과는 4바이트 레지스터에 담을 수 없음
->8바이트 연산 결과는 EAX와 EDX에 걸쳐서 나옴
*EDX는 데이터를 담는데 사용하는 레지스터
*EAX는 연산에 특화된 레지스터
ex)
결과: eax: 00000020
ebx: 00000000
->00 00 00 00 00 00 00 20 (32)
-연산 결과에 따라 저장되는 레지스터
8byte edx, eax
4byte dx, ax
2byte ax
1byte al
-mul (레지스터 혹은 메모리)
지정한 크기에 따라 몇 비트 연산인지를 결정
-곱해지는 숫자는 항상 EAX에 들어가야 함
A X B 일 때
A는 항상 EAX, B는 아무 레지스터나 지정
23강 div
-A * B = C C / B = A
-mul과 반대로 8바이트 / 4바이트 -> 2바이트 이런 식으로 연산 결과가 나옴
B에 따라 C의 크기가 결정됨
ex) B가 2바이트라면 C는 4바이트
-나눠지는 수에 따라 레지스터 크기 결정(?)
ex) 8바이트 나누기 4바이트
mov ebx, 3
mov eax, 20
mov edx, 0
div ebx
결과: eax 0000000A -> 몫(10)
edx 00000002 ->나머지(2)
ex) 4바이트 나누기 2바이트
mov ax,20
mov dx, 0
div word ptr ds[402000](3이 들어있는 상황)
결과: ax: 000A(몫)
dx: 0002(나머지)
*C와 B의 바이트가 같은 경우 해당하는 기계어가 없음, 오류 발생 가능
-> B가 4바이트인 경우 C를 8바이트로 여기고 연산
'해킹 및 보안 > 리버싱' 카테고리의 다른 글
[스무디] 어셈블리어 강의 29~32강 정리 (1) | 2022.12.01 |
---|---|
[스무디]어셈블리어 강의 13~17강 정리 (0) | 2022.10.13 |
[스무디] 어셈블리어 강의 8~12강 정리 (0) | 2022.10.06 |
[스무디] 어셈블리어 강의4~7강 정리 (0) | 2022.10.02 |
[ 스무디 ] 어셈블리어 강의 1~ 3강 정리 (1) | 2022.10.02 |