x86 Assembly๐ค: Essential Part(1)
# ์๋ก
- ์ปดํจํฐ ์์๋ ๋ณต์กํ ๋ ผ๋ฆฌ์ ์ธ๊ณผ๊ด๊ณ๊ฐ ์กด์ฌํ๊ณ , ์ฌ๋ฌ ๊ฐ์ฒด๊ฐ ์ํธ์์ฉํ๋ฉฐ, ๊ทธ ์ธ๊ณ์์ ํต์ฉ๋๋ ๊ธฐ๊ณ์ด(Machine Code)๊ฐ ์์
- ํด์ปค๊ฐ ํ๋ ์ผ์ ๊ทธ ๊ฑฐ๋ํ ์ธ๊ณ์ ํ์ ์ ๊ณต๊ฒฉํ์ฌ ์์คํ ์ ์ฅ์ ํ๋ ๊ฒ
- ์์คํ ํด์ปค: ์ปดํจํฐ์ ์ธ์ด๋ก ์์ฑ๋ ์ํํธ์จ์ด์์ ์ทจ์ฝ์ ์ ๋ฐ๊ฒฌํด์ผ ํจ
- David Wheeler: EDSAC์ ๊ฐ๋ฐํ๋ฉด์ ์ด์ ๋ธ๋ฆฌ ์ธ์ด(Assembly Language)์ ์ด์ ๋ธ๋ฌ(Assembler)๋ผ๋ ๊ฒ์ ๊ณ ์
- ์ด์ ๋ธ๋ฌ(Assembler): ์ผ์ข ์ ํต์ญ์ฌ, ๊ฐ๋ฐ์๋ค์ด ์ด์ ๋ธ๋ฆฌ์ด๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋ ๊ธฐ๊ณ์ด๋ก ์ฝ๋๋ฅผ ์นํ
> ์ด์ ๋ธ๋ฆฌ์ด๊ฐ ๊ธฐ๊ณ์ด๋ณด๋ค๋ ์ธ๊ฐ์ด ์ดํดํ๊ธฐ ์ฌ์ ์ผ๋ฏ๋ก, ๊ฐ๋ฐ์๋ค์ ๋์ฑ ํธ๋ฆฌํ๊ฒ ๊ฐ๋ฐ์ ์งํํ ์๊ฒ ๋จ
> ์ํํธ์จ์ด๋ฅผ ์ญ๋ถ์ํ๋ ์ฌ๋๋ค์ ์ฌ๊ธฐ์ ์ญ๋ฐ ํญ์ ๋ํด, ๊ธฐ๊ณ์ด๋ฅผ ์ด์ ๋ธ๋ฆฌ ์ธ์ด๋ก ๋ฒ์ญํ๋ ์ญ์ด์ ๋ธ๋ฌ(Disassembler)๋ฅผ ๊ฐ๋ฐ
- ๊ธฐ๊ณ์ด๋ก ๊ตฌ์ฑ๋ ์ํํธ์จ์ด๋ฅผ ์ญ์ด์ ๋ธ๋ฌ์ ๋ฃ์ผ๋ฉด, ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ก ๋ฒ์ญ๋จ
> ์ด๋ก ์ธํด ์ํํธ์จ์ด ๋ถ์๊ฐ๋ค์ ์ํํธ์จ์ด๋ฅผ ๋ถ์ํ๋ ค๊ณ ๊ธฐ๊ณ์ด๋ฅผ ์ฝ์ ํ์๊ฐ ์์ด์ก์
# ์ด์ ๋ธ๋ฆฌ์ด์ x86-64
1. ์ด์ ๋ธ๋ฆฌ ์ธ์ด ๐ค
- ์ด์ ๋ธ๋ฆฌ ์ธ์ด: ์ปดํจํฐ์ ๊ธฐ๊ณ์ด์ ์นํ๋๋ ์ธ์ด
> ์ด๋ ๊ธฐ๊ณ์ด๊ฐ ์ฌ๋ฌ ์ข ๋ฅ๋ผ๋ฉด ์ด์ ๋ธ๋ฆฌ์ด๋ ์ด๋ ค ์ข ๋ฅ์ฌ์ผ ํจ
- CPU์ ์ฌ์ฉ๋๋ ๋ช ๋ น์ด ์งํฉ๊ตฌ์กฐ(Instruction Set Architecture, ISA)๋ IA-32, x86-64, ARM, MIPS ๋ฑ ์ข ๋ฅ๊ฐ ๋ค์ํจ
2. x64 ์ด์ ๋ธ๋ฆฌ ์ธ์ด
๊ธฐ๋ณธ ๊ตฌ์กฐ ๐งฑ
- x64 ์ด์ ๋ธ๋ฆฌ ์ธ์ด๋ ๋์ฌ์ ํด๋นํ๋ ๋ช ๋ น์ด(Operation Code, Opcode)์ ๋ชฉ์ ์ด์ ํด๋นํ๋ ํผ์ฐ์ฐ์(Operand)๋ก ๊ตฌ์ฑ
3. ๋ช ๋ น์ด ๐ซ
- ์ธํ ์ x64์๋ ๋ง์ ๋ช ๋ น์ด๊ฐ ์กด์ฌ
4. ํผ์ฐ์ฐ์ ๐ฏ
- ํผ์ฐ์ฐ์์๋ ์ด 3๊ฐ์ง ์ข ๋ฅ๊ฐ ์์
- ์์(Immediate Value)
- ๋ ์ง์คํฐ(Register)
- ๋ฉ๋ชจ๋ฆฌ(Memory)
- ๋ฉ๋ชจ๋ฆฌ ํผ์ฐ์ฐ์๋ []์ผ๋ก ๋๋ฌ์ธ์ธ ๊ฒ์ผ๋ก ํํ๋๋ฉฐ, ์์ ํฌ๊ธฐ ์ง์ ์(Size Directive) TYPE PTR์ด ์ถ๊ฐ๋ ์ ์์
- ํ์ ์๋ BYTE, WORD, DWORD, QWORD๊ฐ ์ฌ ์ ์์ผ๋ฉฐ, ๊ฐ๊ฐ 1๋ฐ์ดํธ, 2๋ฐ์ดํธ, 4๋ฐ์ดํธ, 8๋ฐ์ดํธ์ ํฌ๊ธฐ๋ฅผ ์ง์
๐ ๋ฉ๋ชจ๋ฆฌ ํผ์ฐ์ฐ์์ ์
# x86-64 ์ด์ ๋ธ๋ฆฌ ๋ช ๋ น์ด
1. ๋ฐ์ดํฐ ์ด๋ ๐
- ๋ฐ์ดํฐ ์ด๋ ๋ช ๋ น์ด๋ ์ด๋ค ๊ฐ์ ๋ ์ง์คํฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฎ๊ธฐ๋๋ก ์ง์
mov dst, src // src์ ๋ค์ด์๋ ๊ฐ์ dst์ ๋์
mov QWORD PTR[rdi], rsi // rsi์ ๊ฐ์ rdi๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์์ ๋์
mov QWORD PRT[rdi+8*rcx], rsi // rsi์ ๊ฐ์ rdi+8*rcx๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์์ ๋์
lea dst, src // src์ ์ ํจ ์ฃผ์(Effective Address, EA)๋ฅผ dst์ ์ ์ฅ
lea rsi, [rbx+8*rcx] // rbx+8*rcx๋ฅผ rsi์ ๋์
์์ ๐ ๋ฐ์ดํฐ ์ด๋
- ๋ ์ง์คํฐ, ๋ฉ๋ชจ๋ฆฌ ์ฝ๋๊ฐ ๋ค์๊ณผ ๊ฐ์ ๋, ์๋์์ ์ ์ ํ ๊ฐ์ ์ฑ์ฐ์์ค
- mov rax, [rbx+8] // rbx+8์์น์ ์๋ ๊ฐ์ rax์ ๋์
- lea rax, [rbx+8] // rbx+8์ ์ ํจ ์ฃผ์๋ฅผ rax์ ๋์
2. ์ฐ์ ์ฐ์ฐ โ
- ์ฐ์ ์ฐ์ฐ ๋ช ๋ น์ด๋ ๋ง์ , ๋บ์ , ๊ณฑ์ , ๋๋์ ์ฐ์ฐ์ ์ง์
add dst, src // dst์ src์ ๊ฐ์ ๋ํจ
add eax, 3 // eax += 3
add ax, WORD PTR[rdi] // ax += *(WORD *)rdi
sub dst, src // dst์์ src์ ๊ฐ์ ๋บ
sub eax, 3 // eax -= 3
sub ax, WORD PTR[rdi] // ax -= *(WORD *)rdi
inc op // op์ ๊ฐ์ 1 ์ฆ๊ฐ์ํด
inc eax // eax += 1
dec op // op์ ๊ฐ์ 1 ๊ฐ์์ํด
dec eax // eax -= 1
์์ ๐ ๋ง์ ๊ณผ ๋บ์
- ๋ ์ง์คํฐ, ๋ฉ๋ชจ๋ฆฌ ๋ฐ ์ฝ๋๊ฐ ๋ค์๊ณผ ๊ฐ์ ๋, ์๋์์ ์ ์ ํ ๊ฐ์ ์ฑ์ฐ์์ค
3. ๋ ผ๋ฆฌ ์ฐ์ฐ ๐ค - and & or
- ๋ ผ๋ฆฌ ์ฐ์ฐ ๋ช ๋ น์ด์ ์ฐ์ฐ์ ๋นํธ ๋จ์๋ก ์ด๋ฃจ์ด ์ง
and dst, src // dst์ src์ ๋นํธ๊ฐ ๋ชจ๋ 1์ด๋ฉด 1, ์๋๋ฉด 0
or dst, src // dst์ src์ ๋นํธ ์ค ํ๋๋ผ๋ 1์ด๋ฉด 1, ์๋๋ฉด 0
์์ ๐ ๋ ผ๋ฆฌ ์ฐ์ฐ - and, or
- ๋ ์ง์คํฐ, ๋ฉ๋ชจ๋ฆฌ ๋ฐ ์ฝ๋๊ฐ ๋ค์๊ณผ ๊ฐ์ ๋, ์๋์์ ์ ์ ํ ๊ฐ์ ์ฑ์ฐ์์ค
- f: 1111, 0: 0000์์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ฉด ์ฝ๊ฒ ๊ตฌํ ์ ์์
- OR์ฐ์ฐ ์์๋ f์ 0์ผ๋ก๋ง ์ด๋ฃจ์ด์ง ๊ฐ๊ณผ ์ฐ์ฐ๋ ๋ ํจ๊ป ์ฐ์ฐ๋์ด์ง๋ ๊ฐ์ด ๊ทธ๋๋ก ๋์ถ๋จ
- AND ์ฐ์ฐ ์ f์ ์ฐ์ฐ๋๋ ๋ถ๋ถ์ ๊ทธ๋๋ก ๋์ถ๋๋ฉฐ 0๊ณผ ์ฐ์ฐ๋๋ ๋ถ๋ถ์ ์ ๋ถ 0์ผ๋ก ๋ณ๊ฒฝ๋จ
4. ๋ ผ๋ฆฌ ์ฐ์ฐ ๐ค - xor & not
xor dst, src // dst์ src์ ๋นํธ๊ฐ ์๋ก ๋ค๋ฅด๋ฉด 1, ๊ฐ์ผ๋ฉด 0
not op // op์ ๋นํธ ์ ๋ถ ๋ฐ์
์์ ๐ ๋ ผ๋ฆฌ ์ฐ์ฐ - xor, not
- ๋ ์ง์คํฐ, ๋ฉ๋ชจ๋ฆฌ ๋ฐ ์ฝ๋๊ฐ ๋ค์๊ณผ ๊ฐ์ ๋, ์๋์์ ์ ์ ํ ๊ฐ์ ์ฑ์ฐ์์ค
5. ๋น๊ต โ๏ธ
- ๋น๊ต ์ฐ์ฐ์๋ ๋ ํผ์ฐ์ฐ์์ ๊ฐ์ ๋น๊ตํ๊ณ , ํ๋๊ทธ๋ฅผ ์ค์
cmp op1, op2 // op1๊ณผ op2๋ฅผ ๋น๊ต
cmp๋ ๋ ํผ์ฐ์ฐ์๋ฅผ ๋นผ์ ๋์ ๋น๊ตํจ
์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ op1์ ๋์ ํ์ง ์์
์๋ฅผ ๋ค์ด, ์๋ก ๊ฐ์ ๋ ์๋ฅผ ๋นผ๋ฉด ๊ฒฐ๊ณผ๊ฐ 0์ด ๋์ด ZF ํ๋๊ทธ๊ฐ ์ค์ ๋๋๋ฐ,
์ดํ์ CPU๋ ์ด ํ๋๊ทธ๋ฅผ ๋ณด๊ณ ๋ ๊ฐ์ด ๊ฐ์๋์ง ํ๋จํ ์ ์์
test op1, op2 // op1๊ณผ op2๋ฅผ ๋น๊ต
test๋ ๋ ํผ์ฐ์ฐ์์ AND ๋นํธ ์ฐ์ฐ์ ์ทจํจ
์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ op1์ ๋์ ํ์ง ์์
์๋ฅผ ๋ค์ด, ์์ ์ฌ์ง์ฒ๋ผ 0์ด ๋ rax๋ฅผ op1๊ณผ op2๋ก ์ผ์ test๋ฅผ ์ํํ๋ฉด,
๊ฒฐ๊ณผ๊ฐ 0์ด๋ฏ๋ก ZF ํ๋๊ทธ๊ฐ ์ค์ ๋จ
์ดํ์ CPU๋ ์ด ํ๋๊ทธ๋ฅผ ๋ณด๊ณ rax๊ฐ 0์ด์๋์ง ํ๋จํ ์ ์์
→ ํ๋๊ทธ๋ฅผ ์ค์ ํ๋ ์ ์์ AND์ ์ฐจ์ด๊ฐ ์์
6. ๋ถ๊ธฐ ๐
- ๋ถ๊ธฐ๋ rip๋ฅผ ์ด๋์์ผ ์คํ ํ๋ฆ์ ๋ฐ๊ฟ
- ๋ถ๊ธฐ๋ฌธ์ ์๊ฐ๋๋ ๊ฒ ์ธ์๋ ๊ต์ฅํ ๋ง์ ์๊ฐ ์กด์ฌํจ. ๊ทธ๋ฌ๋ ๋ช ๊ฐ๋ง ์ดํด๋ณด๋ฉด ์ด๋ฆ์ ํตํด ์ง๊ด์ ์ผ๋ก ์๋ฏธ๋ฅผ ํ์ ํ ์ ์๊ธฐ ๋๋ฌธ์, ์ด๋ค์ ์ ๋ถ ๋ค๋ฃจ๊ธฐ ๋ณด๋ค๋ ์์ผ๋ก ์ค์ ์ฝ๋๋ฅผ ๋ถ์ํ๋ฉด์ ๊ฐ์ ์ตํ๋๊ฐ ์ ์๋๋ก ํ ๊ฒ
jmp addr // addr๋ก rip๋ฅผ ์ด๋์ํด
je addr // ์ง์ ์ ๋น๊ตํ ๋ ํผ์ฐ์ฐ์๊ฐ ๊ฐ์ผ๋ฉด ์ ํ (jump if equal)
jg addr // ์ง์ ์ ๋น๊ตํ ๋ ์ฐ์ฐ์ ์ค ์ ์๊ฐ ๋ ํฌ๋ฉด ์ ํ (jump if greater)
# ๋ง์น๋ฉฐ
1. ๋ฐ์ดํฐ ์ด๋ ์ฐ์ฐ์
- mov dst, src // src์ ๊ฐ์ dst์ ๋์
- lea dst, src // src์ ์ ํจ ์ฃผ์๋ฅผ dst์ ๋์
2. ์ฐ์ ์ฐ์ฐ
- and dst, src // src์ ๊ฐ์ dst์ ๋ํจ
- sub dst, src // src์ ๊ฐ์ dst์์ ๋บ
- inc op // op์ ๊ฐ์ 1 ๋ํจ
- dec op // op์ ๊ฐ์ 1 ๋บ
3. ๋ ผ๋ฆฌ ์ฐ์ฐ
- and dst, src // dst์ src๊ฐ ๋ชจ๋ 1์ด๋ฉด 1, ์๋๋ฉด 0
- or dst, src // dst์ src ์ค ํ ์ชฝ์ด๋ผ๋ 1์ด๋ฉด 1, ์๋๋ฉด 0
- xor dst, src // dst์ src๊ฐ ๋ค๋ฅด๋ฉด 1, ๊ฐ์ผ๋ฉด 0
- not op // op์ ๋นํธ๋ฅผ ๋ชจ๋ ๋ฐ์
4. ๋น๊ต
- cmp op1, op2 // op1์์ op2๋ฅผ ๋นผ๊ณ ํ๋๊ทธ๋ฅผ ์ค์
- test op1, op2 // op1๊ณผ op2์์ AND ์ฐ์ฐ์ ํ๊ณ , ํ๋๊ทธ๋ฅผ ์ค์
5. ๋ถ๊ธฐ
- jmp addr // addr๋ก rip ์ด๋
- je addr // ์ง์ ๋น๊ตํด์ ๋ ํผ์ฐ์ฐ์์ ๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐ addr๋ก rip ์ด๋
- jg addr // ์ง์ ๋น๊ตํด์ ๋ ํผ์ฐ์ฐ์ ์ค ์ ์์ ๊ฐ์ด ๋ ํด ๊ฒฝ์ฐ addr๋ก rip ์ด๋
# Quiz
- ํ์ด
1 mov dl, BYTE PTR[rsi+rcx] // BYTE PTR[rsi+rcx]์ ๊ฐ์ dl์ ๋์
2 xor dl, 0x30 // dl์ ์๋ ๊ฐ๊ณผ 0x30์ xor ์ฐ์ฐ. ์ฒซ๋ฒ์งธ 0x400000(0x67)๊ณผ 0x30์ xor ์ฐ์ฐํ๋ฉด 0x57์ด๋ผ๋ ๊ฐ์ ์ป๊ฒ ๋๊ณ ์ด๋ฅผ ๋ค์ dl์ ์ ์ฅํจ
3 mov BYTE PTR[rsi+rcx], dl // dl์ ๊ฐ์ BYTE PTR[rsi+rcx]์ ๋์
4 inc rcx // rcx์ ๊ฐ์ 1 ์ฆ๊ฐ์ํด
5 cmp rcx, 0x19 // rcx์ ๊ฐ์ 0x19์ ๋น๊ต
6 jg end // ์ง์ ์ ๋น๊ตํ ๋ ์ฐ์ฐ์ ์ค ์ ์๊ฐ ๋ ํฌ๋ฉด ํ๋ก๊ทธ๋จ์ ์ข
๋ฃ(rcx๊ฐ 20์ด๋๋ฉด ํ๋ก๊ทธ๋จ ์ข
๋ฃ)
7 jmp 1 // rip๋ฅผ 1๋ก ์ด๋์ํด. ์ฆ, ์ฝ๋๋ฅผ ๋ค์ 1๋ถํฐ ์คํ
'Hacking Tech > System Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dreamhack] Tool: pwntools (0) | 2022.03.28 |
---|---|
[Dreamhack] Tool: gdb (0) | 2022.03.27 |
[Dreamhack] x86 Assembly๐ค: Essential Part(2) (0) | 2022.03.27 |
[Dreamhack] Background: Linux Memory Layout (0) | 2022.03.25 |
[Dreamhack] Background: Computer Architecture (0) | 2022.03.25 |