본문 바로가기

Security study/Reversing

어셈블리 명령어 정리

[1] 데이터 이동 명령어

- MOV : 값을 넣어줌, operand1 <- operand2

- LEA : Load Effective Address 약자로 MOV와 동일, 주소 값을 저장

- PUSH : 스택에 값을 저장, 스택 4byte 증가, ESP 4byte 감소

- POP : 스택 끝에 저장된 값을 가져옴, 스택 4byte 감소, ESP 4byte 증가

[2] 산술연산 명령어

- ADD : 덧셈

- SUB : 뺄셈

- INC : 오퍼랜드 내용을 1증가

- DEC : 오퍼랜드 내용을 1감소

- MUL/IMUL : EAX와 오퍼랜드를 곱셈하여 EAX에 저장

- DIV/IDIV : EAX와 오퍼랜드를 나누어 EAX에 저장

- NEG : 오퍼랜드의 2의 보수(부호반전)

 

[3] 비트연산 명령어

- AND : 두 비트가 모두 1이면 1, 나머지는 0으로 계산

- OR : 두 비트 중 하나라도 1이면 1, 아니면 0으로 계산

- XOR : 각 비트 값을 비교하여 값이 같으면 0, 다르면 1로 계산

- NOT : 비트 값을 반대 값(0->1, 1->0)으로 변경

- SHL : 왼쪽으로 쉬프트 연산

   * 최하위 비트는 0으로 채워지고 기존 값은 CF 플래그 레지스터에 저장

- SHR : 오른쪽으로 쉬프트 연산

   * 최상위 비트는 부호비트로 채워지고 CF 플래그 레지스터에 저장

- ROL/RCL : 왼쪽으로 쉬프트 연산, 최하위 비트는 최상위비트로 채워짐

- ROR/RCR : 오른쪽으로 쉬프트 연산, 최상위 비트는 최하위비트로 채워짐

[4] 제어 명령어

- CMP : 두 개의 오퍼랜드 비교(뺄셈 연산 후 플래그 설정)

- TEST : 두 개의 오퍼랜드 비교(AND 연산 수행 후 플래그를 설정)

- CALL : 해당되는 주소의 함수를 호출하여 수행 코드 위치로 옮김

- INT : 인터럽트를 일으키는 명령어

- LEAVE : 함수에서 사용한 지역변수 스택을 비움

- RET : 스택에 저장된 주소로 복귀

- NOP : 아무 동작도 수행하지 않음(기계어 코드 0x90), 공격 코드를 삽입할 때 자주 쓰임

 

[5] 분기 명령어

- JMP : 무조건 EIP 주소값으로 점프

- JCC : CC(조건부코드) 값에 따라 해당 EIP 주소 값으로 점프

CC(조건부코드) 값 정리표

- JE : Jump If equal

-JNE : Jump if not equal

[6] 반복 명령어

- REP : ECX 레지스터 지정 횟수만큼 또는 ZF 플래그 조건에 맞을 동안 반복

- LOOP : LOOP 영역을 ECX 레지스터 지정 값만큼 반복

 

*출처 : 윈도우즈 보안과 운영실습 - 최은정 교수님 강의자료