본문 바로가기
  • 개발 삽질 블로그
해킹 및 보안/리버싱

[스무디] 어셈블리어 강의 정리 (18~22강)

by 갹둥 2022. 11. 10.

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바이트로 여기고 연산