보안/어셈블리어

악성코드 분석 - 명령어

Eprld 2024. 8. 29. 16:44

 

데이터 이동 

lea : 데이터를 직접 읽지 않고 주소만 계산해서 레지스터에 저장을 하는 명령어

mov : 메모리에서 직접 데이터를 읽어오는 명령어   

 

산술연산

inc : 레지스터나 메모리 값에 1을 더한다

dec : 레지스터나 메모리 값에서 1을 뺸다  

add : 두 값(레지스터, 소스) 을 더한다

sub : 두 값을 뺀다 > 목적지 - 소스

 

논리 연산

and : 두 값의 비트 단위로 and 연산을 수행함, 둘 다 1인 경우에만 1을 반환한다.

or : 두 값의 비트 단위로 or 연산을 수행함, 둘 중 하나라도 1이면 1을 반환한다.

xor : 두 값의 비트 단위로 xor 연산을 수행함, 두 값이 다르면 0을 반환한다

not : 비트를 반전시킴,  즉 1은 0 으로 , 0은 1로 반전시킨다.

 

분기

jmp : 무조건 특정 주소로 점프한다.

je(jump equal) : 두 비교 값이 같을 때 특정 주소로 점프함 (zero flag가 설정되었을 때)

jne(jump not equal) : 값이 다를 때 특정 주소로 이동 

jg : 비교 값이 더 클 때, 특정 주소 이동함

 

스택

push :  스택에 값을 호출한다, 현재 실행 중인 위치를 스택에 저장 후, 지정된 프로세서로 이동함

pop : 스택에서 값을 꺼냄, 가장 최근에 있는 값을 꺼낸다

 

프로시저

call : 함수 호출시에 사용이 된다 jmp 와 다른 점은 되돌아올 다음 명령을 스텍에 저장을 한다.

ret(return) : 프로시저 호출이 끝난 후, 원래 호출된 위치로 돌아간다

leave : 함수가 종료될 때 스택을 정리하는 데 사용됨, 함수에서 스택 프레임을 제거하는 과정

 

dword 4바이트의 데이터를 의미

ptr : 메모리 주소를 다루는 것을 의미

 

레지스터(register) > 데이터를 저장하는 공간   

범용 레지스터 

eax(4byte), ebx(2byte) : 연산에 사용 

ecx : 반복 명령어 사용시 카운터로 사용

edx : eax와 비슷하다, 연산에 사용

esi, edi : 메모리 복사

eip : CPU가 다음에 실행해야 할 메모리 주소가 저장

ebp : parame pointer / 스택 아래를 가리키는 포인터

esp : 스택 주소를 가리키는 포인터

 

esi : 32비트 레지스터  rsi : 64비트 레지스터 

cmp : 두 연산자를 비교하는 명령어 > 두 연산자의 값이 같다면 결과는 0 ZF 는 1로 세트가 된다. 다르면 0

ZF(Zero Flag) : 처음 상태일 때는 Not Zero zf가 0으로 세트된 상태 계산 결과 값이 0일 경우 zf가 1로 세트 nz가 zr로 변경

call : 함수 호출시에 사용이 된다 jmp 와 다른 점은 되돌아올 다음 명령을 스텍에 저장을 한다.


operartion
 - 명령어가 수행할 연산

operand - 연산에 사용할 데이터 또는 위치

stat 에서는 지역변수가 저장이됨

 

- 레지스터를 0으로 초기화 하는 방법

 mov ax, 0 > 일반적인 ax에 0값을 넣는 명령어

sub ax, ax > ax-ax 자신끼리 뺄셈 계산을 하는 방식이다

xor ax, ax > 서로 같은 값을 가질 경우 0이 되는 방식을 이용한다.

 

초기화 시키는 법 : 새로고침  (ctrl + f2) 시작코드(f9)로 이동

 

스택(stack) > 메모리(작업 테이블)에 있는 영역 (여러 일을 동시에 진행 할 수 있음) 

 

레지스터(register) > 데이터를 저장하는 공간   

범용 레지스터 

덤프 메모리 > 데이터, 스택, 혹은 힙 등의 메모리 구조를 분석

'보안 > 어셈블리어' 카테고리의 다른 글

어셈블리어 함수  (0) 2024.09.04
IDA 사용법  (0) 2024.09.02
dbg  (0) 2024.09.02
어셈블리 실습  (0) 2024.09.02
악성코드2  (0) 2024.08.30