๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ ๋ณด์•ˆ·์ทจ์•ฝ์ /๐Ÿ”ธ์‹œ์Šคํ…œ·์šด์˜์ฒด์ œ

[dreamhack] x86 assembly

by Jenny:! 2022. 7. 9.

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