본문 바로가기

악성코드 분석

악성코드 분석을 위한 어셈블리어(1)

악성코드 분석을 위해 어셈블리어를 많이 알수록 좋지만 처음 배우는 입장에서 힘들고 지치기 쉽다.

그래서 악성코드 분석을 위해 가장 중요하고 기초적인 내용만 다룰려고 한다.

악성코드를 분석하기 전에 어셈블리어가 무엇인지, 명령어,스택, 함수 호출규약을 최소한 알아야한다.

 

1. 어셈블리어란?

어셈블리어는 기계어와 1대1 대응이 되는 프로그래밍 언어이다.

사람이 알아보기 힘들고 사람의 언어와 매우 달라 저급 프로그래밍 언어라고도 한다.

고급언어인 c언어로 된 파일을 컴파일 하면 어셈블리어가 되고 어셈블리어는 기계어로 번역되어 동작한다.

 

2.x86 레지스터

여기서 모든 레지스터를 다루지는 않을것이다.

일단 이것만큰은 반드시 알아야한다고 생각되는것만 넣었다.

eax,ebx,ecx,edx  : 범용 레지스터로 32bit 접근 가능한 레지스터이다. 아래 헥사값 처럼 32bit 값을 저장하거나 접근이 가능하다.

eax(0x) 1a 2b 3c 4d

ax.bx.cx.dx : 범용레지스터에서 16bit만 접근 가능한 레지스터이다.

eax(0x) 1a 2b 3c 4d
ax(0x) 3c 4d

al,bl,cl,dl : 범용레지스터에서 8bit만 접근 가능한 레지스터이다.

eax(0x) 1a 2b 3c 4d
al(0x) 4d

zero flag : 제로 플래그는 연산 결과가 0이면 1이 된다.

sign flag : 부호플래그는 연산결과가 음수이면 1이 된다.

 

 

3. 어셈블리어 명령어

우리가 반드시 알아야하는 명령어들이 존재한다.

명령어   예시
mov 값을 이동시킨다. mov eax, 1
lea 주소를 이동시킨다? lea 
jmp 해당 주소로 점프한다. jmp 401000
cmp 값을 비교한다. cmp eax,1
jz zero flag가 1이면 점프 jz 402435
test   test eax,eax
call 함수를 호출한다. call fun1()

CMP는 비교하는 방법이 앞 자리에서 뒤 자리를 빼서 0이면 같다 음수면 작다 0보다 크면 크다고 하고 0이면 zero flag를 세우고 음수면 sign flag를 세운다.

 

 

4. 스택(stack)

stack은 한글로 번역하면 쌓는다는 이야기이다.

위가 뚫린 바구니하나에 차곡 차곡 물건들을 정리하듯 데이터들을 차곡 차곡 쌓아둔다.

esp : 스택의 최상단을 의미합니다.

2b5b756a
3a2a1a6a
2b341a9d
1a1a1a8a

ebp : 스택의 가장 아래 부분을 의미합니다.

 

이 스택을 알아야 함수 호출 규약을 이해 할 수 있습니다.

'악성코드 분석' 카테고리의 다른 글

악성코드 분석을 위한 함수 호출 규약  (5) 2023.05.23