Jastes 2022. 3. 24. 19:00

ํ•ด์ปค์˜ ์–ธ์–ด: ์–ด์…ˆ๋ธ”๋ฆฌ๐Ÿ’ฌ

PC์—์„œ ๋ณต์žกํ•œ ๋…ผ๋ฆฌ์  ์ธ๊ณผ๊ด€๊ณ„, ์—ฌ๋Ÿฌ ๊ฐœ์ฒด๊ฐ€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉฐ ๊ทธ ์„ธ๊ณ„์—์„œ ํ†ต์šฉ๋˜๋Š” ๊ธฐ๊ณ„์–ด(Machine Code)์–ธ์–ด ํ•ต์‹ฌ!

 

์‹œ์Šคํ…œ ํ•ดํ‚น์„ ํ•  ๋•Œ๋Š” ์ปดํ“จํ„ฐ ์–ธ์–ด, ์šด์˜์ฒด์ œ, ๋„คํŠธ์›Œํฌ, ์•”ํ˜ธํ•™ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฐ์šธ ๊ฒƒ๋“ค์ด ์กด์žฌํ•˜์ง€๋งŒ, ๊ทธ์ค‘

์‹œ์Šคํ…œ ํ•ด์ปค๊ฐ€ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šต๋“ํ•ด์•ผ ํ•˜๋Š” ์ง€์‹์€ ์ปดํ“จํ„ฐ ์–ธ์–ด์— ๊ด€ํ•œ ๊ฒƒ์ž„!

์‹œ์Šคํ…œ ํ•ด์ปค๋Š” ์ปดํ“จํ„ฐ์˜ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์†Œํ”„ํŠธ์›จ์–ด์—์„œ ์ทจ์•ฝ์ ์„ ๋ฐœ๊ฒฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ

๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š” PC ์–ธ์–ด์ธ ๊ธฐ๊ณ„์–ด๊ฐ€ ๋„ˆ๋ฌด ์ดํ•ดํ•˜๊ณ  ์ž‘์„ฑํ•˜๊ธฐ ํž˜๋“ค๊ธฐ์— ๋‚œํ•ดํ•œ ๊ธฐ๊ณ„์–ด๋ฅผ ๋ฐ”๊พผ ์‚ฌ๋žŒ์ด ์žˆ์œผ๋‹ˆ,

์ปดํ“จํ„ฐ ๊ณผํ•™์ž ์ค‘ ํ•œ ๋ช…์ธ David Wheeler๋Š” EDSAC์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ 

์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด(Assembly Language)์™€ ์–ด์…ˆ๋ธ”๋Ÿฌ(Assembler)๋ผ๋Š” ๊ฒƒ์„ ๊ณ ์•ˆ

์–ด์…ˆ๋ธ”๋Ÿฌ๋Š” ์ผ์ข…์— ํ†ต์—ญ๊ธฐ๋กœ์จ ๊ฐœ๋ฐœ์ž๋“ค์ด ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ปดํ“จํ„ฐ๊ฐ€ ๊ธฐ๊ณ„์–ด๋กœ ์ฝ”๋“œ๋ฅผ ์น˜ํ™˜ํ•ด์คŒ

 

๊ทธ๋Ÿฐ๋ฐ SW๋ฅผ ์—ญ๋ถ„์„ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์—ฌ๊ธฐ์„œ ์—ญ๋ฐœ์ƒ์„ ๋”ํ•ด,

๊ธฐ๊ณ„์–ด๋ฅผ ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด๋กœ ๋ฒˆ์—ญํ•˜๋Š” ์—ญ์–ด์…ˆ๋ธ”๋Ÿฌ(Disassembler)๋ฅผ ๊ฐœ๋ฐœ!!

์—ฌ๊ธฐ์„  ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๊ฐœ๋žต์ ์ธ ์„ค๋ช… ๋ฐ x86-64(x64)์˜ ๋ช…๋ น์–ด๋งŒ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

 


์–ด์…ˆ๋ธ”๋ฆฌ์–ด์™€ x86-64

์ปดํ“จํ„ฐ์˜ ๊ธฐ๊ณ„์–ด์™€ ์น˜ํ™˜๋˜๋Š” ์–ธ์–ด!

๊ทธ ์ „์— ์„ค๋ช…ํ•˜์˜€๋˜ ๋ช…๋ น์–ด ์ง‘ํ•ฉ๊ตฌ์กฐ(ISA)๋ฅผ ์„ค๋ช…ํ•  ๋•Œ ๋ดค๋“œ์‹œ CPU์— ์‚ฌ์šฉ๋˜๋Š” ISA์˜ ์ข…๋ฅ˜๋Š” ๋งŽ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋“ค์˜ ์ข…๋ฅ˜๋งŒํผ ๋งŽ์€ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๊ฐ€ ์กด์žฌํ•˜๊ณ , ๋งŽ์ด ์•Œ์ˆ˜๋ก ์ข‹์ง€๋งŒ ์šฐ๋ฆฐ x64 ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋งŒ!

 


๊ธฐ๋ณธ ๊ตฌ์กฐ๐Ÿงฑ

์–ธ์–ด์˜ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ• ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ํŒŒ์•…ํ•ด์•ผ ๋ฌธ์žฅ์ด ์ดํ•ด๋˜๋“ฏ์ด ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

x64 ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํ•œ๊ตญ์–ด๋ณด๋‹ค ํ›จ์”ฌ ๋‹จ์ˆœํ•œ ๋ฌธ๋ฒ• ๊ตฌ์กฐ๋กœ ์ด๋“ค์˜ ๋ฌธ์žฅ์€

๋™์‚ฌ์— ํ•ด๋‹นํ•˜๋Š” ๋ช…๋ น์–ด(Operation Code, Opcode)
๋ชฉ์ ์–ด์— ํ•ด๋‹นํ•˜๋Š” ํ”ผ์—ฐ์‚ฐ์ž(Operand, OP)

 


๋ช…๋ น์–ด๐Ÿ”ซ

์ธํ…”์˜ x64์—๋Š” ๋งค์šฐ ๋งŽ์€ ๋ช…๋ น์–ด๊ฐ€ ์žˆ์œผ๋‚˜ ์ด ์ค‘์—์„œ ์ค‘์š”ํ•œ 21๊ฐœ์˜ ๋ช…๋ น์–ด๋ฅผ ๋‹ค๋ฃฐ ์˜ˆ์ •

 

์ •๋ฆฌํ•  ๋ช…๋ น์–ด๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถ„๋ฅ˜

๋ช…๋ น์–ด ์ฝ”๋“œ
๋ฐ์ดํ„ฐ ์ด๋™(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

 


ํ”ผ์—ฐ์‚ฐ์ž๐ŸŽฏ

TYPE PTR์˜ ํƒ€์ž…์— ๋”ฐ๋ผ BYTE, WORD, DWORD, QWORD๋กœ ๊ฐ๊ฐ 1-2-4-8byte๋กœ ํฌ๊ธฐ๊ฐ€ ์ง€์ •๋จ

 

ํ”ผ์—ฐ์‚ฐ์ž๋Š” ์ด 3๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ƒ์ˆ˜(Immediate Value)
  • ๋ ˆ์ง€์Šคํ„ฐ(Register)
  • ๋ฉ”๋ชจ๋ฆฌ(Memory)

๋ฉ”๋ชจ๋ฆฌ ํ”ผ์—ฐ์‚ฐ์ž๋Š” []์œผ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ๊ฒƒ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉฐ, ์•ž์˜ ํฌ๊ธฐ ์ง€์ •์ž(Size Directive) TYPE PTR์ด ์ถ”๊ฐ€ ๊ฐ€๋Šฅ

 

๐Ÿ‘‡๋ฉ”๋ชจ๋ฆฌ ํ”ผ์—ฐ์‚ฐ์ž์˜ ์˜ˆ

๋ฉ”๋ชจ๋ฆฌ ํ”ผ์—ฐ์‚ฐ์ž
QWORD PTR [0x8048000] 0x8048000์˜ ๋ฐ์ดํ„ฐ๋ฅผ 8๋ฐ”์ดํŠธ๋งŒํผ ์ฐธ์กฐ
DWORD PTR [0x8048000] 0x8048000์˜ ๋ฐ์ดํ„ฐ๋ฅผ 4๋ฐ”์ดํŠธ๋งŒํผ ์ฐธ์กฐ
WORD PTR [rax] rax๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ์ฃผ์†Œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ 2๋ฐ”์ดํŠธ ๋งŒํผ ์ฐธ์กฐ

๐Ÿฆœ์ž๋ฃŒํ˜• WORD์˜ ํฌ๊ธฐ๊ฐ€ 2๋ฐ”์ดํŠธ์ธ ์ด์œ 

 ์ดˆ๊ธฐ ์ธํ…” WORD์˜ ํฌ๊ธฐ๊ฐ€ 16๋น„ํŠธ์ธ IA-16 ์•„ํ‚คํ…์ฒ˜๋กœ ๊ฐœ๋ฐœ๋˜์–ด CPU์˜ WORD๊ฐ€ 16๋น„ํŠธ์ด๊ธฐ
๋•Œ๋ฌธ์—, ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋„ WORD๋ฅผ 16๋น„ํŠธ ์ž๋ฃŒํ˜•์œผ๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ดˆ์ ์„ ๋งž์ถค

 ์ดํ›„ ๊ฐœ๋ฐœ๋œ IA-32, x86-64 ์•„ํ‚คํ…์ฒ˜๋Š” CPU์˜ WORD๊ฐ€ 32, 64๋น„ํŠธ๋กœ ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ WORD ์ž๋ฃŒํ˜•์˜ ํฌ๊ธฐ๋ฅผ ๋๊นŒ์ง€ 16๋น„ํŠธ๋กœ ์œ ์ง€ํ•˜์˜€์œผ๋ฉฐ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ ๋•Œ๋ฌธ!

 


๋ฐ์ดํ„ฐ ์ด๋™๐Ÿšš

์–ด๋–ค ๊ฐ’์„ ๋ ˆ์ง€์Šคํ„ฐ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฎ๊ธฐ๋„๋ก ์ง€์‹œํ•จ

๋ฐ์ดํ„ฐ ์ด๋™
mov (rdi, rsi) ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๋„ฃ๊ธฐ๋งŒ ํ•จ / (ris์˜ ๊ฐ’์„ rdi์— ๋Œ€์ž…)
lea (rsi, [rbx+8* rcx]) ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ด / (rbx+8*rcx๋ฅผ rsi์— ๋Œ€์ž…)

 

 


์‚ฐ์ˆ  ์—ฐ์‚ฐโŒ

๋ง์…ˆ, ๋บ„์…ˆ, ๊ณฑ์…ˆ, ๋‚˜๋ˆ—์…ˆ ์—ฐ์‚ฐ์„ ์ง€์‹œ

์‚ฐ์ˆ  ์—ฐ์‚ฐ
add (eax, 3) ๋ง์…ˆ / (eax+=3)
sub (eax, 3) ๋บ„์…ˆ / (eax -=3)
inc (eax) op์˜ ๊ฐ’์„ 1 ์ฆ๊ฐ€ / (eax++)
dec (eax)  op์˜ ๊ฐ’์„ 1 ๊ฐ์†Œ / (eax--)

 


๋…ผ๋ฆฌ ์—ฐ์‚ฐ๐Ÿค” - and & or

 

and, or, xor, neg ๋“ฑ์˜ ๋น„ํŠธ ์—ฐ์‚ฐ์„ ์ง€์‹œ

๋…ผ๋ฆฌ ์—ฐ์‚ฐ
and ๋น„ํŠธ ์—ฐ์‚ฐ์ž๋กœ and(๋‘˜ ๋‹ค 1) ์—ญํ• 
or ๋น„ํŠธ ์—ฐ์‚ฐ์ž๋กœ or(ํ•˜๋‚˜์ด์ƒ 1) ์—ญํ• 
xor ๋น„ํŠธ ์—ฐ์‚ฐ์ž๋กœ xor(1๊ฐœ๋งŒ ์žˆ์œผ๋ฉด ๋ถ€์ •) ์—ญํ• 
not ๋น„ํŠธ ์—ฐ์‚ฐ์ž๋กœ not(๋ถ€์ •) ์—ญํ• 

์œ„ ๋‚ด์šฉ์€ ์ฐ ๊ธฐ๋ณธ์ด๋ผ.. ๊ทธ๋ƒฅ ๋งํฌ ๋ณด์‹œ๊ณ  ํ•˜์„ธ์š” ๋„ˆ๋ฌด ์ ๊ธฐ ํž˜๋“œ๋„ค์š” ใ… 

์ฐธ๊ณ ๋กœ 0xff..์ด๊ฒŒ ์—ฌ๊ธฐ์„  ํ™•์‹คํ•œ 1์ด์˜ˆ์š” ํ•ด์„œ ์œ„ 0xff..๋กœ ๋น„๊ตํ•˜๋ฉด f๋ฅผ ์ ๋Š”๊ฑด ์•„๋‹Œ๊ฑฐ์˜ˆ์š” ๊ทธ๋ƒฅ ๊ตฌ๋ถ„..? ๋Š๋‚Œ

TMI๋กœ xor์„ ์—ฐ์† ๋‘๋ฒˆํ•˜๋ฉด ๋‹ค์‹œ ์›๋ž˜ ๊ฐ’์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ์„ฑ์งˆ์„ ์ด์šฉํ•œ ์•”ํ˜ธํ•™์œผ๋กœ XOR_cipher๋ผ๋Š” ๊ฒƒ๋„ ์žˆ์–ด์š”

 

 

๋น„ํŠธ ์—ฐ์‚ฐ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

 

ko.wikipedia.org

 


๋น„๊ตโš–๏ธ

๋‘ ํ”ผ์—ฐ์‚ฐ์ž(OP)์˜ ๊ฐ’์„ ๋น„๊ตํ•˜๊ณ , ๋ธ”๋ž˜๊ทธ๋ฅผ ์„ค์ •

๋น„๊ต
cmp (op1, op2) ์„œ๋กœ ๊ฐ’์„ ๋น„๊ต, ๋‘ ์ˆ˜๋ฅผ ๋นผ์„œ / (op1 == op2์ธ ์‹์œผ๋กœ) ์ด์ „์— ์ ์€ ํ”Œ๋ž˜๊ทธ๋กœ ํ‘œํ˜„
test ์„œ๋กœ ๊ฐ’์„ and๋กœ ๋น„๊ต / ์ด๊ฑด ๋ณ„๋กœ ์•ˆ ์“ธ๊ฑฐ ๊ฐ™์œผ๋‹ˆ๊นŒ ๋ญ ์ด๋Ÿฐ ์‹์œผ๋กœ๋งŒ ์–‘ํ•ด์š”..

 


๋ถ„๊ธฐ๐Ÿ”€

rip๋ฅผ ์ด๋™์‹œ์ผœ ์‹คํ–‰ ํ๋ฆ„ ๋ฐ”๊ฟˆ

 

์ด ๋ถ€๋ถ„์€ ๋„ˆ๋ฌด ๋งŽ์ด ์กด์žฌํ•˜๊ธฐ๋„ ํ•˜์ง€๋งŒ ๋‹จ์–ด ๋œป์„ ๋ณด๋ฉด ๋Œ€๋žต์ ์œผ๋กœ ํŒŒ์•…์ด ๊ฐ€๋Šฅํ•˜๋‹ˆ๊นŒ ํ๋ฆ„๋งŒ!!

์‹ฌ์ง€์–ด ์กฐ๊ฑด ๋ถ€๋ถ„ ํ›„ ๋ถ€์†์ ์œผ๋กœ ๋”ธ๋ ค์˜ค๋Š” ์นœ๊ตฌ๋“ค์ด๋‹ˆ๊นŒ ํŠนํžˆ ๊ทธ๋ž˜์š”

๋ถ„๊ธฐ
jmp addr addr๋กœ rip์ด๋™ํ•˜๋Š” ๊ฒƒ
je addr ๋น„๊ตํ•œ ๋‘ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ๊ฐ™์œผ๋ฉด rip๋ฅผ addr๋กœ ์ด๋™(jump if equal)
jg addr ๋น„๊ตํ•œ ๋‘ ํ”ผ์—ฐ์‚ฐ์ž ์ค‘ ์ „์ž๊ฐ€ ํฌ๋ฉด rip๋ฅผ addr๋กœ ์ด๋™(jump if greater)

 


Opcode : ์Šคํƒ๐Ÿงฑ

push val : val๋ฅผ ์Šคํƒ ์ตœ์ƒ๋‹จ์— ์Œ“์Œ / pop reg : ์Šคํƒ ์ตœ์ƒ๋‹จ์— ๊ฐ’ ๊บผ๋‚ด์„œ reg์— ๋Œ€์ž…


 


Opcode : ํ”„๋กœ์‹œ์ €๐Ÿ“œ

ํŠน์ • ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ ์กฐ๊ฐ ์ฆ‰, ํ•จ์ˆ˜์™€ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ

 

ํ”„๋กœ์‹œ์ €๋ฅผ ๋ถ€๋ฅด๋Š” ํ–‰์œ„๋ฅผ ํ˜ธ์ถœ(Call)์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ํ”„๋กœ์‹œ์ €์—์„œ ๋Œ์•„์˜ค๋Š” ๊ฒƒ์„ ๋ฐ˜ํ™˜(Return)์ด๋ผ๊ณ  ํ•จ

ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” ํ”„๋กœ์‹œ์ €๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜์„œ ์›๋ž˜์˜ ์‹คํ–‰ ํ๋ฆ„์œผ๋กœ ๋Œ์•„์™€์•ผ ํ•˜๋ฏ€๋กœ,

call ๋‹ค์Œ์˜ ๋ช…๋ น์–ด ์ฃผ์†Œ(return address, ๋ฐ˜ํ™˜ ์ฃผ์†Œ)๋ฅผ ์Šคํƒ์— ์ €์žฅํ•˜๊ณ  ํ”„๋กœ์‹œ์ €๋ฅผ rip๋กœ ์ด๋™

x64์–ด์…ˆ๋ธ”๋ฆฌ์–ธ์–ด์—๋Š” ํ”„๋กœ์‹œ์ €์˜ ํ˜ธ์ถœ๊ณผ ๋ฐ˜ํ™˜์„ ์œ„ํ•œ call, leave, ret ๋ช…๋ น์–ด๊ฐ€ ์กด์žฌํ•จ

 

Call addr : ํ˜ธ์ถœ


 

leave : ์Šคํƒํ”„๋ ˆ์ž„ ์ •๋ฆฌ


๐Ÿ’ก์Šคํƒํ”„๋ ˆ์ž„์ด๋ž€?

 ์Šคํƒ์€ ์ž‘์—… ์ค‘(์ง€์—ญ๋ณ€์ˆ˜, ํ•จ์ˆ˜ ๋˜๋Š” ์—ฐ์‚ฐ๊ณผ์ • ๋“ฑ) ๋ถ€์ฐจ์ ์œผ๋กœ ์ƒ๊ฒจ๋‚˜๋Š” ์ž„์‹œ ๊ฐ’๋“ค์„ ์ €์žฅํ•˜๋Š” ์˜์—ญ
๋งŒ์•ฝ ์ด ์Šคํƒ ์˜์—ญ์„ ์•„๋ฌด๋Ÿฐ ๊ตฌ๋ถ„ X ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ๊ฒน์น˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ ↑

์˜ˆ์‹œ๋กœ Aํ•จ์ˆ˜๊ฐ€ B๋ผ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ, ์ด ๋‘˜์ด ๊ฐ™์€ ์Šคํƒ ์˜์—ญ ์‚ฌ์šฉ ์‹œ B์—์„œ A์˜
์ง€์—ญ๋ณ€์ˆ˜ ๋ชจ๋‘ ์˜ค์—ผ ๊ฐ€๋Šฅ! ๋”ฐ๋ผ์„œ ์ •์ƒ์ ์ธ ์—ฐ์‚ฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์‹ฌ๊ฐํ•˜๊ฒŒ ๋ฐœ์ƒ

 ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜๋ณ„๋กœ ์„œ๋กœ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์Šคํƒ์˜ ์˜์—ญ์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์Šคํƒํ”„๋ ˆ์ž„ ์‚ฌ์šฉ!

 

ret : return address๋กœ ๋ฐ˜ํ™˜


 


Opcode : ์‹œ์Šคํ…œ ์ฝœ๐Ÿ“Ÿ

์‹œ์Šคํ…œ์€ ํ•ดํ‚น์œผ๋กœ๋ถ€ํ„ฐ ๊ถŒํ•œ ์ œ์–ด ๋ฐ ๋ณดํ˜ธ๋ฅผ ์œ„ํ•ด ์ปค๋„ ๋ชจ๋“œ์™€ ์œ ์ € ๋ชจ๋“œ๋กœ ๊ถŒํ•œ์„ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌ

 

์ปค๋„ ๋ชจ๋“œ


OS๊ฐ€ ์ „์ฒด ์‹œ์Šคํ…œ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์‹œ์Šคํ…œ SW์— ๋ถ€์—ฌํ•˜๋Š” ๊ถŒํ•œํŒŒ์ผ์‹œ์Šคํ…œ, I/O, ๋„คํŠธ์›Œํฌ ํ†ต์‹ , ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋“ฑ ๋ชจ๋“  ์ €์ˆ˜์ค€์˜ ์ž‘์—…์€ ์ปค๋„ ๋ชจ๋“œ์—์„œ ์ง„ํ–‰์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ๋ถ€๋ถ„์„ ์ œ์–ด ๊ฐ€๋Šฅํ•˜์—ฌ ํ•ด์ปค๊ฐ€ ์ง„์ž… ์‹œ ์‹œ์Šคํ…œ์€ ๊ฑฐ์˜ ๋ฌด๋ฐฉ๋น„ ์ƒํƒœ๊ฐ€ ๋จ์ด์— ๋Œ€ํ•˜์—ฌ ์ƒ์„ธํ•œ ๋ถ€๋ถ„์€ ๋‚˜์ค‘์—..


์œ ์ € ๋ชจ๋“œ


OS๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถ€์—ฌํ•˜๋Š” ๊ถŒํ•œ

๋ณดํ†ต ์‚ฌ์šฉ์ž๋“ค์ด ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ PC ์‚ฌ์šฉ ํ–‰๋™์ด ๋ชจ๋‘ ์œ ์ € ๋ชจ๋“œ์—์„œ ์ง„ํ–‰

๋ฆฌ๋ˆ…์Šค์—์„œ ๋ฃจํŠธ ๊ถŒํ•œ์œผ๋กœ ์‚ฌ์šฉ์ž ์ถ”๊ฐ€, ํŒจํ‚ค์ง€ ๋‹ค์šด๋กœ๋“œ ํ–‰์œ„๋„ ๋งˆ์ฐฌ๊ฐ€์ง€

์œ ์ € ๋ชจ๋“œ๋ฅผ ํ•ด์ปค๊ฐ€ ์ทจ๋“ํ•ด๋„ ๊ถŒํ•œ ๋ณดํ˜ธ ๊ฐ€๋Šฅ


์‹œ์Šคํ…œ ์ฝœ(System Call, syscall) - x64 ์•„ํ‚คํ…์ฒ˜ ์‚ฌ์šฉ

์œ ์ € ๋ชจ๋“œ์—์„œ ์ปค๋„ ๋ชจ๋“œ์˜ ์‹œ์Šคํ…œ SW์—๊ฒŒ ์–ด๋–ค ๋™์ž‘์„ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉSW๋Š” ๋Œ€๋ถ€๋ถ„ ์ปค๋„์˜ ๋„์›€์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์‹œ์Šคํ…œ ์ฝœ์ด ํ•„์š”ํ•œ ์ด์œ Ex) ์‚ฌ์šฉ์ž๊ฐ€ cat flag๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, cat์€ ์ปค๋„ ๋ช…๋ น์–ด๋กœ ํ•ด์•ผํ•˜๋ฏ€๋กœ... syscall์„ ์‚ฌ์šฉํ•จ

 

 

Syscall


 

x64 Syscall tables

 

์ข…๋ฅ˜๋„ ๋ฌด์ง€ ๋งŽ๊ณ  ๊ฒ€์ƒ‰ํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์™ธ์šธ ํ•„์š”๊ฐ€ ์—†๊ณ ,

๋‚˜์ค‘์— ์‰˜์ฝ”๋”ฉ์„ ํ•˜๋‹ค๋ณด๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ค‘์š”ํ•œ ๋ช‡ ๊ฐ€์ง€๋Š” ์ต์ˆ™ํ•ด์งˆ ๊ฑฐ์˜ˆ์š”



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 X
X
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

 


์š”์•ฝ๐Ÿ—’๏ธ

  1. ๋ฐ์ดํ„ฐ ์ด๋™ ์—ฐ์‚ฐ์ž
    • mov dst, src : src์˜ ๊ฐ’์„ dst์— ๋Œ€์ž…
    • lea dst, src : src์˜ ์œ ํšจ ์ฃผ์†Œ๋ฅผ dst์— ๋Œ€์ž…
  2. ์‚ฐ์ˆ  ์—ฐ์‚ฐ
    • add dst, src : src์˜ ๊ฐ’์„ dst์— ๋”ํ•จ
    • sub dst, src : src์˜ ๊ฐ’์„ dst์—์„œ ๋บŒ
    • inc op : op์˜ ๊ฐ’์„ 1 ๋”ํ•จ / op++;
    • dec op : op์˜ ๊ฐ’์„ 1 ๋บŒ / op--;
  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 ์ด๋™
  6. ์Šคํƒ
    • push val : rsp๋ฅผ 8๋งŒํผ ๋นผ๊ณ , ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ์— val์„ ์Œ“๋Š”๋‹ค
    • pop reg : ์Šคํƒ ์ตœ์ƒ๋‹จ์˜ ๊ฐ’์„ reg์— ๋„ฃ๊ณ , rsp๋ฅผ 8๋งŒํผ ๋”ํ•จ
  7. ํ”„๋กœ์‹œ์ €
    • call addr : addr์˜ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœ
    • leave : ์Šคํƒ ํ”„๋ ˆ์ž„์„ ์ •๋ฆฌ
    • ret : ํ˜ธ์ถœ์ž์˜ ์‹คํ–‰ ํ๋ฆ„์œผ๋กœ ๋Œ์•„๊ฐ
  8. ์‹œ์Šคํ…œ ์ฝœ
    • syscall : ์ปค๋„์—์„œ ํ•„์š”ํ•œ ๋™์ž‘์„ ์š”์ฒญ

์ฐธ๊ณ  ์ž๋ฃŒ(๋‹จ, ์œ„ ๋ถ€๋ถ„์€ ์ œ๊ฐ€ ๋ฐฐ์šด ๋‚ด์šฉ ์š”์•ฝ์— ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ์œ„ ๋‚ด์šฉ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.)

 

x86 Assembly๐Ÿค–: Essential Part(1)

์‹œ์Šคํ…œ ํ•ดํ‚น์„ ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ธฐ์ดˆ์ ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด๋ฅผ ๋ฐฐ์›๋‹ˆ๋‹ค.

dreamhack.io

 

 

[์ •๋ฆฌ] ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ์ •๋ฆฌ

์•ˆ๋…•ํ•˜์„ธ์š”. ์นธ์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธ ์‚ฌ์ •์œผ๋กœ ์ธํ•˜์—ฌ ๊ธ€์„ ๋„ˆ๋ฌด ๋Šฆ๊ฒŒ ์˜ฌ๋ฆฌ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‹œํ—˜ ๋งˆ์น˜๊ณ  ๋ฐ”...

blog.naver.com

์ฐธ๊ณ  ์ด๋ฏธ์ง€

 

x86 Assembly๐Ÿค–: Essential Part(1)

์‹œ์Šคํ…œ ํ•ดํ‚น์„ ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ธฐ์ดˆ์ ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด๋ฅผ ๋ฐฐ์›๋‹ˆ๋‹ค.

dreamhack.io