์ด์ ๋ธ๋ฆฌ ์ธ์ด
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด(C, C++, JAVA, Python) ๋ณด๋ค ์ ์์ค ์ธ์ด๋ก ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋๋ก ๋ง๋ ์ธ์ด.
์ข ๋ฅ : IA-32(intel 32bit), x86-64, ARM, MIPS
์ด์ ๋ธ๋ฆฌ์ด(Assembly Language)
- ๊ธฐ๊ณ์ด์ ์ผ๋์ผ ๋์์ด ๋๋ ์ ์์ค ์ธ์ด
- ์ฌ์ฉ์๊ฐ ์ดํดํ๊ธฐ ์ด๋ ค์ด ๊ธฐ๊ณ์ด ๋์ ์ ๋ช ๋ น ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ฐ์ํ ์ ์๋ ๊ธฐํธ๋ฅผ ๊ธฐ๊ณ์ด์ 1:1๋ก ๋์์์ผ ์ฝ๋ํํ ๊ธฐํธ ์ธ์ด
๊ธฐ๊ณ์ด(Machine Language)
- ํ๋ก๊ทธ๋จ์ ๋ํ๋ด๋ ๊ฐ์ฅ ๋ฎ์ ๋จ๊ณ์ ๊ฐ๋ .
- ์ค์์ฒ๋ฆฌ์ฅ์น(CPU)๊ฐ ์ง์ ํ๋ ํ๊ณ ์คํํ ์ ์๋ ๋นํธ(0๊ณผ 1์ ์กฐํฉ) ๋จ์๋ก ์ฐ์ธ ์ปดํจํฐ ์ธ์ด
๊ธฐ๋ณธ๊ตฌ์กฐ
๊ธฐ๋ณธํํ : ๋ช ๋ น์ด(์ต์ฝ๋) + ์ธ์(์คํผ๋๋)
๋ช ๋ น์ด (์ต์ฝ๋)
๋ช ๋ น ์ฝ๋ | ์ค๋ช |
๋ฐ์ดํฐ ์ด๋(Data Transfer) | mov, lea |
์ฐ์ ์ฐ์ฐ(Arithmetic) | inc, dec, add, sub |
๋ ผ๋ฆฌ ์ฐ์ฐ(Logical) | and, or, xor, not |
๋น๊ต(Comparison) | cmp, test |
๋ถ๊ธฐ(Branch) | jmp, je, jg, jl , jnz |
์คํ(Stack) | push, pop, pushad, popad |
ํ๋ก์์ ธ(Procedure) | call, ret, leave |
์์คํ ์ฝ(System call) | syscall |
์ธํฐ๋ฝํธ | int (cpu๊ฐ ์ ๊น ๋ฉ์ถ๋ ๋ช ๋ น์ด) |
์ธ์ (์คํผ๋๋)
BYTE, WORD, DWORD, QWORD๊ฐ ์ฌ ์ ์์ผ๋ฉฐ, ๊ฐ๊ฐ 1๋ฐ์ดํธ, 2๋ฐ์ดํธ, 4๋ฐ์ดํธ, 8๋ฐ์ดํธ
- ์์(Immediate Value)
- ๋ ์ง์คํฐ(Register)
- ๋ฉ๋ชจ๋ฆฌ(Memory)
๋ฐ์ดํฐ ์ด๋ (Data Transfer)
1. mov dst, src : src์ ๋ค์ด์๋ ๊ฐ์ dst์ ๋์ ํฉ๋๋ค.
mov eax, ebx | ebx์ ๊ฐ์ eax์ ๋์ |
mov QWORD PTR[rdi], ebx | ebx์ ๊ฐ์ eax๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์์ ๋์ |
2. lea dst, src : src์ ์ฃผ์๋ฅผ dst์ ๋์ ํฉ๋๋ค.
lea eax, [ebx] | ebx์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ eax์ ๋์ |
3. xchg dst, src : src์ ๊ฐ๊ณผ dst์ ๊ฐ์ ๊ต์ฒดํฉ๋๋ค.
xchg eax, ebx | eax์ ebx์ ๊ฐ์ ๊ตํ |
xchg al, BYTE PTR [ebx] | al ๋ ์ง์คํฐ์ ebx ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๋ฐ์ดํธ ๊ฐ์ ๊ตํ |
xchg eax, DWORD PTR [ebx] | eax ๋ ์ง์คํฐ์ ebx ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ 4๋ฐ์ดํธ ๊ฐ์ ๊ตํ |
์ฐ์ ์ฐ์ฐ (Arithmetic)
1. add dst, src : dst์ src์ ๊ฐ์ ๋ํฉ๋๋ค.
add eax, 3 | eax += 3 |
add eax, DWORD PTR[ebx] | ebx ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๊ฐ์ eax์ ๋ํจ |
2. sub dst, src : dst์์ src์ ๊ฐ์ ๋บ๋๋ค.
sub eax, 3 | eax -= 3 |
sub eax, DWORD PTR[ebx] | ebx ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๊ฐ์ eax์ ๋บ |
3. inc op: op์ ๊ฐ์ 1 ์ฆ๊ฐ์ํด
inc eax | eax += 1 |
4. dec op: op์ ๊ฐ์ 1 ๊ฐ์ ์ํด
dec eax | eax -= 1 |
๋ ผ๋ฆฌ ์ฐ์ฐ (Logical)
1. and dst, src : dst์ src์ ๊ฐ์ ๋นํธ ๋จ์๋ก AND ์ฐ์ฐํฉ๋๋ค.
and eax, 0xFF | eax &= 0xFF |
and eax, DWORD PTR[ebx] | ebx ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๊ฐ๊ณผ eax๋ฅผ AND ์ฐ์ฐ |
2. or dst, src : dst์ src์ ๊ฐ์ ๋นํธ ๋จ์๋ก OR ์ฐ์ฐํฉ๋๋ค.
or eax, 0xFF | eax |= 0xFF |
or eax, DWORD PTR[ebx] | ebx ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๊ฐ๊ณผ eax๋ฅผ OR ์ฐ์ฐ |
3. xor dst, src : dst์ src์ ๊ฐ์ ๋นํธ ๋จ์๋ก XOR ์ฐ์ฐํฉ๋๋ค.
xor eax, eax | eax ^= eax (๊ฒฐ๊ณผ์ ์ผ๋ก eax = 0) |
xor eax, DWORD PTR[ebx] | ebx ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๊ฐ๊ณผ eax๋ฅผ XOR ์ฐ์ฐ |
4. not op : op์ ๋นํธ๋ฅผ ๋ฐ์ ์ํต๋๋ค.
not eax | eax = ~eax |
๋น๊ต (Comparison)
1. cmp dst, src : dst์ src์ ๊ฐ์ ๋น๊ตํฉ๋๋ค.
cmp eax, 5 | eax์ 5๋ฅผ ๋น๊ต |
cmp eax, DWORD PTR[ebx] | eax์ ebx ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๊ฐ์ ๋น๊ต |
2. test dst, src : dst์ src์ ๋นํธ ๋จ์ AND ์ฐ์ฐ์ ์ํํฉ๋๋ค.
test eax, eax | eax์ eax์ ๋นํธ ๋จ์ AND ์ฐ์ฐ (๊ฒฐ๊ณผ์ ์ผ๋ก eax๊ฐ 0์ธ์ง ํ์ธ) |
test eax, 0x01 | eax์ 0x01์ ๋นํธ ๋จ์ AND ์ฐ์ฐ |
๋ถ๊ธฐ (Branch)
1. ์กฐ๊ฑด์ ๋ฐ๋ผ ์ง์ ๋ ์ฃผ์๋ก ์ ํํฉ๋๋ค.
jmp 0x00401000 | ๋ฌด์กฐ๊ฑด ์ฃผ์ 0x00401000์ผ๋ก ์ ํ |
je 0x00401000 | ZF == 1์ด๋ฉด ์ฃผ์ 0x00401000์ผ๋ก ์ ํ |
jne 0x00401000 | ZF == 0์ด๋ฉด ์ฃผ์ 0x00401000์ผ๋ก ์ ํ |
jg 0x00401000 | eax > 0์ด๋ฉด ์ฃผ์ 0x00401000์ผ๋ก ์ ํ |
jl 0x00401000 | eax < 0์ด๋ฉด ์ฃผ์ 0x00401000์ผ๋ก ์ ํ |
jge 0x00401000 | eax >= 0์ด๋ฉด ์ฃผ์ 0x00401000์ผ๋ก ์ ํ |
jle 0x00401000 | eax <= 0์ด๋ฉด ์ฃผ์ 0x00401000์ผ๋ก ์ ํ |
์คํ (Stack)
1. push src : src์ ๊ฐ์ ์คํ์ ํธ์ํฉ๋๋ค. ์คํ ํฌ์ธํฐ๊ฐ ๊ฐ์ํ๊ณ , ๊ทธ ์์น์ ๊ฐ์ด ์ ์ฅ๋ฉ๋๋ค.
push eax | eax์ ๊ฐ์ ์คํ์ ํธ์ (rsp ๊ฐ์, *rsp = eax) |
push 0x1234 | ๊ฐ 0x1234๋ฅผ ์คํ์ ํธ์ (rsp ๊ฐ์, *rsp = 0x1234) |
push rax | rax์ ๊ฐ์ ์คํ์ ํธ์ (rsp ๊ฐ์, *rsp = rax) |
2. pushad : ๋ชจ๋ ๋ฒ์ฉ ๋ ์ง์คํฐ๋ฅผ ์คํ์ ํธ์ํฉ๋๋ค. (eax, ecx, edx, ebx, esp, ebp, esi, edi๋ฅผ ์์๋๋ก ํธ์)
pushad | ๋ชจ๋ ๋ฒ์ฉ ๋ ์ง์คํฐ๋ฅผ ์คํ์ ํธ์ (rsp ๊ฐ์, ๊ฐ ๋ ์ง์คํฐ์ ๊ฐ์ด ์์๋๋ก ์คํ์ ์ ์ฅ) |
3. pop dst : ์คํ์์ ๊ฐ์ ํํ์ฌ dst์ ์ ์ฅํฉ๋๋ค. ์คํ ํฌ์ธํฐ๊ฐ ์ฆ๊ฐํ๊ณ , ๊ทธ ์์น์์ ๊ฐ์ ์ฝ์ด dst์ ์ ์ฅํฉ๋๋ค.
pop ebx | ์คํ์์ ๊ฐ์ ํํ์ฌ ebx์ ์ ์ฅ (*rsp = ebx, rsp ์ฆ๊ฐ) |
pop eax | ์คํ์์ ๊ฐ์ ํํ์ฌ eax์ ์ ์ฅ (*rsp = eax, rsp ์ฆ๊ฐ) |
pop rax | ์คํ์์ ๊ฐ์ ํํ์ฌ rax์ ์ ์ฅ (*rsp = rax, rsp ์ฆ๊ฐ) |
4. popad : ์คํ์์ ๋ชจ๋ ๋ฒ์ฉ ๋ ์ง์คํฐ ๊ฐ์ ํํฉ๋๋ค. (์์๋๋ก eax, ecx, edx, ebx, esp, ebp, esi, edi์ ์ ์ฅ)
popad | ์คํ์์ ๋ชจ๋ ๋ฒ์ฉ ๋ ์ง์คํฐ ๊ฐ์ ํ |
ํ๋ก์์ (Procedure)
1. call address : ์ง์ ๋ ์ฃผ์๋ก ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ํธ์ถ ์ ์ ํ์ฌ์ ๋ช ๋ น์ด ํฌ์ธํฐ๋ฅผ ์คํ์ ํธ์ํ์ฌ ๋์ค์ ret ๋ช ๋ น์ด๋ก ๋ณต๊ทํ ์ ์๋๋ก ํฉ๋๋ค.
call 0x00401000 | ์ฃผ์ 0x00401000์ผ๋ก ํจ์ ํธ์ถ ([rsp] = return address, rsp ๊ฐ์) |
2. ret : ํ์ฌ ์คํ์์ ๋ฐํ ์ฃผ์๋ฅผ ํํ์ฌ ๊ทธ ์ฃผ์๋ก ์ ํํฉ๋๋ค. ํจ์ ํธ์ถ ์ดํ ํธ์ถ๋ ์ง์ ์ผ๋ก ๋ณต๊ทํฉ๋๋ค.
ret | ์คํ์์ ๋ฐํ ์ฃผ์๋ฅผ ํํ์ฌ ๊ทธ ์ฃผ์๋ก ์ ํ (rsp ์ฆ๊ฐ) |
3. leave : ํ์ฌ ์คํ ํ๋ ์์ ์ ๋ฆฌํฉ๋๋ค. ๋ณดํต ret ๋ช ๋ น์ด์ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. ์คํ ํฌ์ธํฐ(rsp)๋ฅผ ๋ณต์ํ๊ณ , ํ๋ ์ ํฌ์ธํฐrbp๋ฅผ ๋ณต์ํฉ๋๋ค.
leave | ํ์ฌ ์คํ ํ๋ ์ ์ ๋ฆฌ (rsp = rbp, pop rbp) |
์์คํ ์ฝ (System Call)
syscall : ์ฌ์ฉ์ ๋ชจ๋์์ ์ปค๋ ๋ชจ๋๋ก ์ ํํ๋ ๋ช ๋ น์ด๋ก ์์คํ ์ฝ์ ์ํํฉ๋๋ค. ์ด ๋ช ๋ น์ด๋ ์ฌ์ฉ์ ๋ชจ๋์์ ์ปค๋ ๋ชจ๋๋ก์ ์ ํ์ ์ํํ๋ฉฐ, ์ด์ ์ฒด์ ์ ์๋น์ค๋ฅผ ์์ฒญํฉ๋๋ค.
syscall ํ์ฌ ๋ ์ง์คํฐ์ ์ค์ ๋ ์์คํ ์ฝ ๋ฒํธ์ ์ธ์๋ก ์ปค๋ ๋ชจ๋๋ก ์ ํํ์ฌ ์์คํ ์ฝ์ ์คํ
์์ ์ฝ๋:
mov rax, 60 | ์์คํ ์ฝ ๋ฒํธ 60 (๋ฆฌ๋ ์ค์์ exit ์์คํ ์ฝ) ์ค์ |
mov rdi, 0 | exit ์์คํ ์ฝ์ ์ธ์๋ก 0 (์ข ๋ฃ ์ํ ์ฝ๋) ์ค์ |
syscall | exit ์์คํ ์ฝ์ ํธ์ถํ์ฌ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃ |
์์:
mov rax, 1 ; ์์คํ
์ฝ ๋ฒํธ 1 (sys_write)
mov rdi, 1 ; ํ์ผ ๋์คํฌ๋ฆฝํฐ 1 (stdout)
mov rsi, message ; ๋ฉ์์ง์ ์ฃผ์
mov rdx, 13 ; ๋ฉ์์ง์ ๊ธธ์ด
syscall ; ์์คํ
์ฝ ํธ์ถ
์์ ์์์์, sys_write ์์คํ ์ฝ์ ์ฌ์ฉํ์ฌ ํ์ค ์ถ๋ ฅ(stdout)์ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํฉ๋๋ค. rax์ ์์คํ ์ฝ ๋ฒํธ๋ฅผ ์ค์ ํ๊ณ , rdi, rsi, rdx์ ์ธ์๋ฅผ ์ค์ ํ ํ syscall ๋ช ๋ น์ด๋ก ์ปค๋ ๋ชจ๋์์ ์์คํ ์ฝ์ ์ํํฉ๋๋ค.
์ธํฐ๋ฝํธ (Interrupt)
int n : ์ํํธ์จ์ด ์ธํฐ๋ฝํธ๋ฅผ ๋ฐ์์ํต๋๋ค. n์ ์ธํฐ๋ฝํธ ๋ฒกํฐ๋ฅผ ๋ํ๋ด๋ฉฐ, ํด๋น ๋ฒกํฐ์ ์ํด ์ง์ ๋ ์ธํฐ๋ฝํธ ํธ๋ค๋ฌ๊ฐ ํธ์ถ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด์ ์ฒด์ ๋ ํ๋์จ์ด์์ ์ํธ์์ฉ์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
- ํ๋์จ์ด ์ธํฐ๋ฝํธ: ํ๋์จ์ด ์ฅ์น๊ฐ CPU์ ์ฃผ์๋ฅผ ์๊ตฌํ ๋ ๋ฐ์ํฉ๋๋ค (์: ํค๋ณด๋ ์ ๋ ฅ, ํ์ด๋จธ ์ด๋ฒคํธ).
- ์ํํธ์จ์ด ์ธํฐ๋ฝํธ: ์ํํธ์จ์ด๊ฐ CPU์ ํน์ ์์ ์ ์ํํ๋๋ก ์์ฒญํ ๋ ๋ฐ์ํฉ๋๋ค (์: ์์คํ ์ฝ).
์ธํฐ๋ฝํธ ์ฒ๋ฆฌ ๊ณผ์ :
- ํ์ฌ ๋ช ๋ น์ด ์ ์ฅ : ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ๋ฉด CPU๋ ํ์ฌ ์คํ ์ค์ธ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ ์คํ์ ์ ์ฅํ์ฌ ๋์ค์ ๋ณต๊ทํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ธํฐ๋ฝํธ ๋ฒกํฐ ์กฐํ : ์ธํฐ๋ฝํธ ๋ฒกํฐ ํ ์ด๋ธ์์ ์ธํฐ๋ฝํธ ํธ๋ค๋ฌ์ ์ฃผ์๋ฅผ ์กฐํํฉ๋๋ค.
- ์ธํฐ๋ฝํธ ํธ๋ค๋ฌ ์คํ : ์กฐํ๋ ํธ๋ค๋ฌ ์ฃผ์๋ก ์ ํํ์ฌ ์ธํฐ๋ฝํธ ํธ๋ค๋ฌ๋ฅผ ์คํํฉ๋๋ค.
- ๋ณต๊ท : ํธ๋ค๋ฌ ์คํ์ด ์๋ฃ๋๋ฉด ์คํ์์ ์ ์ฅ๋ ๋ช ๋ น์ด ์ฃผ์๋ฅผ ๊ฐ์ ธ์ ๋ณต๊ทํฉ๋๋ค.
์์ ์ฝ๋:
int 0x80 | ๋ฆฌ๋ ์ค ์์คํ ์ฝ ์ธํฐ๋ฝํธ ํธ์ถ |
mov eax, 1 | ์์คํ ์ฝ ๋ฒํธ 1 (sys_exit) ์ค์ |
mov ebx, 0 | ์ข ๋ฃ ์ฝ๋ 0 ์ค์ |
int 0x80 | ์์คํ ์ฝ ํธ์ถ (ํ๋ก์ธ์ค ์ข ๋ฃ) |
์์ ์ค๋ช :
mov eax, 1 ; ์์คํ
์ฝ ๋ฒํธ 1 (sys_exit)
mov ebx, 0 ; ์ข
๋ฃ ์ํ ์ฝ๋ 0
int 0x80 ; ๋ฆฌ๋
์ค ์ปค๋๋ก ์์คํ
์ฝ ์์ฒญ
์ด ์ฝ๋ ์์ ๋ int 0x80 ์ธํฐ๋ฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ๋ ์ค์์ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๋ ์์คํ ์ฝ์ ํธ์ถํฉ๋๋ค. eax ๋ ์ง์คํฐ์ ์์คํ ์ฝ ๋ฒํธ๋ฅผ ์ค์ ํ๊ณ , ebx์ ์ธ์๋ฅผ ์ค์ ํ ํ int 0x80์ ํตํด ์ปค๋ ๋ชจ๋๋ก ์ ํํ์ฌ ์์คํ ์ฝ์ ์คํํฉ๋๋ค.
'๐ฆพ ๋ณด์ ๐ฆพ > ๋ฆฌ๋ฒ์ฑ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Practical Malware Analysis] Lab01-02.exe ๋ถ์ (1) | 2024.10.01 |
---|---|
[Practical Malware Analysis] Lab01-01.exe, Lab01-01.dll ๋ถ์ (0) | 2024.09.30 |
x86-64 CPU ๋ ์ง์คํฐ (0) | 2024.08.28 |
CPU ๊ตฌ์กฐ (1) | 2024.08.26 |
PE ํ์ผ ๊ตฌ์กฐ (0) | 2024.08.26 |