1. ์๋ก
์ปดํจํฐ์ ์ธ์ด์ธ ๊ธฐ๊ณ์ด๋ 0๊ณผ 1๋ก๋ง ๊ตฌ์ฑ๋ผ ์์ด์ ์ดํดํ๊ธฐ ์ด๋ ต๊ธฐ์ ์ด์ ๋ธ๋ฌ์ ๋์์ ๋ฐ์ต๋๋ค.
- ์ด์ ๋ธ๋ฌ(Assembler) : ์ด์ ๋ธ๋ฆฌ์ด๋ก ์ฝ๋๋ฅผ ์์ฑ โก๏ธ ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋ ๊ธฐ๊ณ์ด๋ก ์ฝ๋๋ฅผ ์นํ
- ์ญ์ด์ ๋ธ๋ฌ(Disassembler) : ๊ธฐ๊ณ์ด๋ก ๊ตฌ์ฑ๋ ์ํํธ์จ์ด โก๏ธ ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ก ๋ฒ์ญ
2. x86-64์ ์ด์ ๋ธ๋ฆฌ ์ธ์ด
2.1. ์ด์ ๋ธ๋ฆฌ ์ธ์ด
์ด์ ๋ธ๋ฆฌ ์ธ์ด๋ ๊ธฐ๊ณ์ด์ ์นํ๋๋ ์ธ์ด์ด๋ฏ๋ก ๊ธฐ๊ณ์ด๊ฐ ์ฌ๋ฌ ์ข ๋ฅ๋ผ๋ฉด, ์ด์ ๋ธ๋ฆฌ์ด๋ ์ฌ๋ฌ ์ข ๋ฅ์ฌ์ผ ํฉ๋๋ค. CPU์์ ์ฌ์ฉ๋๋ ISA๋ IA-32, x86-64, ARM, MIPS ๋ฑ ์ข ๋ฅ๊ฐ ๊ต์ฅํ ๋ค์ํฉ๋๋ค.
2.2. x86-64 ์ด์ ๋ธ๋ฆฌ
๋ฌธ๋ฒ ๊ตฌ์กฐ
๋์ฌ์ ํด๋นํ๋ ๋ช ๋ น์ด(Operation Code, Opcode)์ ๋ชฉ์ ์ด์ ํด๋นํ๋ ํผ์ฐ์ฐ์(Operand)๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.

x86-64 ์ด์ ๋ธ๋ฆฌ ๋ช ๋ น์ด
| ๋ช ๋ น ์ฝ๋ | |
| ๋ฐ์ดํฐ ์ด๋(Data Transfer) | mov, lea |
| ์ฐ์ ์ฐ์ฐ(Arithmetic) | inc, dec, add, sub |
| ๋ ผ๋ฆฌ ์ฐ์ฐ(Logical) | and, or, xor, not |
| ๋น๊ต(Comparison) | cmp, test |
| ๋ถ๊ธฐ(Branch) | jmp, je, jg |
| ์คํ(Stack) | push, pop |
| ํ๋ก์์ ธ(Procedure) | call, ret, leave |
| ์์คํ ์ฝ(System call) | syscall |
2.3. ํผ์ฐ์ฐ์
ํผ์ฐ์ฐ์์๋ ์ด 3๊ฐ์ง ์ข ๋ฅ๊ฐ ์ฌ ์ ์์ต๋๋ค.
- ์์(Immediate Value)
- ๋ ์ง์คํฐ(Register)
- ๋ฉ๋ชจ๋ฆฌ(Memory)
๋ฉ๋ชจ๋ฆฌ ํผ์ฐ์ฐ์
๋ฉ๋ชจ๋ฆฌ ํผ์ฐ์ฐ์๋ []์ผ๋ก ๋๋ฌ์ธ์ธ ๊ฒ์ผ๋ก ํํ๋๋ฉฐ, ์์ TYPE PTR์ด ์ถ๊ฐ๋ ์ ์์ต๋๋ค.
- ํฌ๊ธฐ ์ง์ ์(Size Directive) TYPE PTR
- BYTE : 1๋ฐ์ดํธ
- WORD : 2๋ฐ์ดํธ
- DWORD : 4๋ฐ์ดํธ
- QWORD : 8๋ฐ์ดํธ
๋ฉ๋ชจ๋ฆฌ ํผ์ฐ์ฐ์์ ์
| QWORD PTR [0x8048000] | 0x8048000์ ๋ฐ์ดํฐ๋ฅผ 8๋ฐ์ดํธ๋งํผ ์ฐธ์กฐ |
| DWORD PTR [0x8048000] | 0x8048000์ ๋ฐ์ดํฐ๋ฅผ 4๋ฐ์ดํธ๋งํผ ์ฐธ์กฐ |
| WORD PTR [rax] | rax๊ฐ ๊ฐ๋ฅดํค๋ ์ฃผ์์์ ๋ฐ์ดํฐ๋ฅผ 2๋ฐ์ดํธ ๋งํผ ์ฐธ์กฐ |
์๋ฃํ WORD์ ํฌ๊ธฐ๊ฐ 2๋ฐ์ดํธ์ธ ์ด์
IA-32, x86-64 ์ํคํ ์ฒ๋ CPU์ WORD๊ฐ 32, 64๋นํธ๋ก ํ์ฅ๋์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก WORD์ ์๋ฃํ๋ 32, 64๋นํธ์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ๋น์ฐํด ๋ณด์ ๋๋ค. ๊ทธ๋ฌ๋, ๊ธฐ์กด์ ํ๋ก๊ทธ๋จ๋ค๊ณผ์ ํธํ ๋ฌธ์ ๋ก ์ธํด WORD์ ํฌ๊ธฐ๋ ๊ทธ๋๋ก ์ ์งํ๊ณ , DWORD(Double Word, 32bit)์ QWORD(Quad Word, 64bit)์๋ฃํ์ ์ถ๊ฐ๋ก ๋ง๋ค์์ต๋๋ค.
3. x86-64 ์ด์ ๋ธ๋ฆฌ ๋ช ๋ น์ด
3.1. ๋ฐ์ดํฐ ์ด๋ ์ฐ์ฐ์(Data Transfer)
๋ฐ์ดํฐ ์ด๋ ๋ช ๋ น์ด๋ ์ด๋ค ๊ฐ์ ๋ ์ง์คํฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฎ๊ธฐ๋๋ก ์ง์ํฉ๋๋ค.
- mov dst, src : src์ ๊ฐ์ dst์ ๋์
- lea dst, src : src์ ์ ํจ ์ฃผ์๋ฅผ dst์ ๋์
3.2. ์ฐ์ ์ฐ์ฐ(Arithmetic)
์ฐ์ ์ฐ์ฐ ๋ช ๋ น์ด๋ ๋ง์ , ๋บ์ , ๊ณฑ์ , ๋๋์ ์ฐ์ฐ์ ์ง์ํฉ๋๋ค.
- add dst, src : src์ ๊ฐ์ dst์ ๋ํจ
- sub dst, src : src์ ๊ฐ์ dst์์ ๋บ
- inc op : op์ ๊ฐ์ 1 ๋ํจ
- dec op : op์ ๊ฐ์ 1 ๋บ
3.3. ๋ ผ๋ฆฌ ์ฐ์ฐ(Logical)
- 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์ ๋นํธ๋ฅผ ๋ชจ๋ ๋ฐ์
๋ ผ๋ฆฌ ์ฐ์ฐ xor, not ์์
[Register]
rax = 0x35014541
rbx = 0xdeadbeef
[Code]
1: xor rax, rbx โก๏ธ rax์ ์ ์ฅ๋๋ ๊ฐ : 0xebacfbae
2: xor rax, rbx โก๏ธrax์ ์ ์ฅ๋๋ ๊ฐ : 0x35014541
3: not eax โก๏ธ eax์ ์ ์ฅ๋๋ ๊ฐ : 0xcafebabe
- [Code] 2 : xor์ฐ์ฐ์ ๋์ผํ ๊ฐ์ผ๋ก ๋ ๋ฒ ์คํํ ๊ฒฝ์ฐ, ์๋ ๊ฐ์ผ๋ก ๋์๊ฐ๋๋ค.
- [Code] 3 : rax๊ฐ ์๋ eax๋ฅผ notํ์ฌ๋ ๊ด์ฐฎ์ ์ด์ ๋ eax๊ฐ rax์ ํ์ 32๋นํธ๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ง์ฝ not rax๋ฅผ ์ํํ๋ค๋ฉด ๋ต์ 0xffffffffcafebabe๊ฐ ๋ฉ๋๋ค.
3.4. ๋น๊ต(Comparison)
- cmp op1, op2 : op1์์ op2๋ฅผ ๋นผ๊ณ ํ๋๊ทธ๋ฅผ ์ค์ , ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ op1์ ๋์ ํ์ง ์์ต๋๋ค.
- test op1, op2 : op1๊ณผ op2์ AND ์ฐ์ฐ์ ํ๊ณ , ํ๋๊ทธ๋ฅผ ์ค์ , ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ op1์ ๋์ ํ์ง ์์ต๋๋ค.
3.5. ๋ถ๊ธฐ(Branch)
rip๋ฅผ ์ด๋์์ผ ์คํ ํ๋ฆ์ ๋ฐ๊ฟ๋๋ค.
- jmp addr : addr๋ก rip ์ด๋
- je addr(jump if equl) : ์ง์ ๋น๊ต์์ ๋ ํผ์ฐ์ฐ์์ ๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐ addr๋ก rip ์ด๋
- jg addr(jump if greater) : ์ง์ ๋น๊ต์์ ๋ ํผ์ฐ์ฐ์ ์ค ์ ์์ ๊ฐ์ด ๋ ํด ๊ฒฝ์ฐ addr๋ก rip ์ด๋
3.6. ์คํ(Stack)
- push val : rsp๋ฅผ 8๋ฐ์ดํธ๋งํผ ๊ฐ์์ํค๊ณ , ์คํ์ ์ต์๋จ์ val์ ์์ต๋๋ค.
- pop reg : ์คํ ์ต์๋จ์ ๊ฐ์ ๊บผ๋ด์ reg์ ๋์ ํ๊ณ , rsp๋ฅผ 8๋ฐ์ดํธ๋งํผ ๋ํฉ๋๋ค.
3.7. ํ๋ก์์ (Procedure)
ํ๋ก์์ ๋ ํน์ ๊ธฐ๋ฅ์ ์ํํ๋ ์ฝ๋ ์กฐ๊ฐ์ ๋งํฉ๋๋ค. ๋ฐ๋ณต๋๋ ์ฐ์ฐ์ ํ๋ก์์ ํธ์ถ๋ก ๋์ฒดํ์ฌ ์ ์ฒด ์ฝ๋ ํฌ๊ธฐ๋ฅผ ์ค์ผ ์ ์๊ณ , ๊ธฐ๋ฅ๋ณ๋ก ์ฝ๋ ์กฐ๊ฐ์ ์ด๋ฆ์ ๋ถ์ฌ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
- call addr : addr์ ์์นํ ํ๋ก์์ ํธ์ถ
- leave : ์คํ ํ๋ ์ ์ ๋ฆฌ
- ret : return address๋ก ๋ฐํ, ์ฆ ํธ์ถ์์ ์คํ ํ๋ฆ์ผ๋ก ๋์๊ฐ๋๋ค. pop rip ์ฐ์ฐ
ํ๋ก์์ ์ ์
| ์ฐ์ฐ push return_address jmp addr |
|
| ์์ [Register] rip = 0x400000 rsp = 0x7fffffffc400 [Stack] 0x7fffffffc3f8 | 0x0 0x7fffffffc400 | 0x0 โฌ ๏ธ rsp [Code] 0x400000 | call 0x401000 โฌ ๏ธ rip 0x400005 | mov esi, eax ... 0x401000 | push rbp |
๊ฒฐ๊ณผ [Register] rip = 0x401000 rsp = 0x7fffffffc3f8 [Stack] 0x7fffffffc3f8 | 0x400005 โฌ ๏ธ rsp 0x7fffffffc400 | 0x0 [Code] 0x400000 | call 0x401000 0x400005 | mov esi, eax ... 0x401000 | push rbp โฌ ๏ธ rip |
- call 0x401000 : ์คํ์์ rsp(์คํ ์ต์๋จ)๋ 0x7fffffffc400 ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํจ๋ค. rip๊ฐ ๊ฐ๋ฆฌํค๋ [Code] ์ฒซ ๋ฒ์งธ ์ค์ ๋ณด๋ฉด, ์ฃผ์ 0x401000์ ํธ์ถํด์ผ ํ๋ค. ๊ทธ๋ฌ๋ฉด rip๊ฐ 0x401000์ผ๋ก ์ฎ๊ฒจ์ ธ์ผ ํ๋ค.
- push rbp : ์คํ์ ์ต์๋จ์ rbp๋ฅผ ์๋๋ค๋ ์๋ฏธ๋ค. ํฌ์ธํฐ๊ฐ ์คํ์ ์ต์๋จ์ ๊ฐ๋ฆฌํค๋๋ก ํ๊ธฐ ์ํด rsp๋ฅผ 8๋ฐ์ดํธ๋งํผ ๊ฐ์์ํจ๋ค. ์ด์ rsp๋ 0x7fffffffc3f8๋ฅผ ๊ฐ๋ฆฌํจ๋ค. rbp(์คํ ์์์ )
3.8. ์์คํ ์ฝ(System call)
์ปค๋ ๋ชจ๋
์ด์์ฒด์ ๊ฐ ์ ์ฒด ์์คํ ์ ์ ์ดํ๊ธฐ ์ํด ์์คํ ์ํํธ์จ์ด์ ๋ถ์ฌํ๋ ๊ถํ์ ๋๋ค. ์ปค๋ ๋ชจ๋์์๋ ์์คํ ์ ๋ชจ๋ ๋ถ๋ถ์ ์ ์ดํ ์ ์์ต๋๋ค. ํ์ผ์์คํ , ์ ๋ ฅ/์ถ๋ ฅ, ๋คํธ์ํฌ ํต์ , ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฑ ๋ชจ๋ ์ ์์ค์ ์์ ์ ์ฌ์ฉ์ ๋ชจ๋ฅด๊ฒ ์ปค๋ ๋ชจ๋์์ ์งํ๋ฉ๋๋ค.
์ ์ ๋ชจ๋
์ด์์ฒด์ ๊ฐ ์ฌ์ฉ์์๊ฒ ๋ถ์ฌํ๋ ๊ถํ์
๋๋ค. ์ ํ๋ธ๋ฅผ ์์ฒญํ๋ ๊ฒ, ๊ฒ์์ ํ๊ณ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ ๊ฒ ๋ฑ์ ๋ชจ๋ ์ ์ ๋ชจ๋์์ ์ด๋ฃจ์ด์ง๋๋ค. ๋ฆฌ๋
์ค์์ ๋ฃจํธ ๊ถํ์ผ๋ก ์ฌ์ฉ์๋ฅผ ์ถ๊ฐํ๊ณ , ํจํค์ง๋ฅผ ๋ด๋ ค ๋ฐ๋ ํ์ ๋ฑ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค
์์คํ
์ฝ(system call, syscall)์ ์ ์ ๋ชจ๋์์ ์ปค๋ ๋ชจ๋์ ์์คํ
์ํํธ์จ์ด์๊ฒ ์ด๋ค ๋์์ ์์ฒญํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์ํํธ์จ์ด ๋๋ถ๋ถ์ ์ปค๋์ ๋์์ด ํ์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ cat flag๋ฅผ ์คํํ๋ฉด, cat์ flag๋ผ๋ ํ์ผ์ ์ฝ์ด์ ์ฌ์ฉ์์ ํ๋ฉด์ ์ถ๋ ฅํด ์ค์ผ ํฉ๋๋ค. flag๋ ํ์ผ ์์คํ ์ ์กด์ฌํ๋๋ฐ, ์ ์ ๋ชจ๋๋ ํ์ผ ์์คํ ์ ์ง์ ์ ๊ทผํ ์ ์์ผ๋ฏ๋ก ์ปค๋์ด ๋์์ ์ค์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์, ๋์์ด ํ์ํ๋ค๋ ์์ฒญ์ ์์คํ ์ฝ์ด๋ผ๊ณ ํฉ๋๋ค.
์ ์ ๋ชจ๋์ ์ํํธ์จ์ด๊ฐ ํ์ํ ๋์์ ์์ฒญํ๋ฉด, ์ปค๋์ด ์์ฒญํ ๋์์ ์ํํ์ฌ ์ ์ ์๊ฒ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. x64์ํคํ ์ฒ์์๋ ์์คํ ์ฝ์ ์ํด syscall ๋ช ๋ น์ด๊ฐ ์์ต๋๋ค.
- syscall : ์ปค๋์๊ฒ ์์ฒญ์ ๋ํ๋ด๋ ํจ์์
๋๋ค.
- ์์ฒญ : rax
- ์ธ์ ์์ : rdi → rsi → rdx → rcx → r8 → r9 → stack
x64 syscall ํ ์ด๋ธ
์ดํ๋ ์์คํ ์ฝ ํ ์ด๋ธ์ ์ผ๋ถ์ ๋๋ค. ์ด ๊ฐฏ์๊ฐ 300๊ฐ์ ๋ฌํ๊ณ , ๊ฒ์ํ๋ฉด ์ฝ๊ฒ ์ฐพ์ ์ ์์ผ๋ฏ๋ก ์ธ์ธ ํ์๋ ์์ต๋๋ค.
| syscall | rax | arg0 (rdi) | arg1 (rsi) | arg2 (rdx) |
| read | 0x00 | unsigned int fd | char *buf | size_t count |
| write | 0x01 | unsigned int fd | const char *buf | size_t count |
| open | 0x02 | const char *filename | int flags | umode_t mode |
| close | 0x03 | unsigned int fd | ||
| mprotect | 0x0a | unsigned long start | size_t len | unsigned long prot |
| connect | 0x2a | int sockfd | struct sockaddr * addr | int addrlen |
| execve | 0x3b | const char *filename | const char *const *argv | const char *const *envp |
'๐ ๋ณด์ยท์ทจ์ฝ์ > ๐ธ์์คํ ยท์ด์์ฒด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| File Descriptor (0) | 2022.08.12 |
|---|---|
| [ubuntu] pwntools ์ฌ์ฉ ์ค์ต (0) | 2022.08.11 |
| quiz ํ์ผ ํ์ด (0) | 2022.08.11 |
| [dreamhack] Tool: gdb (0) | 2022.07.28 |
| [dreamhack] Background: Linux Memory Layout (0) | 2022.07.28 |