[System] ์ปดํจํฐ ๊ตฌ์กฐ, ํฐ ๋ ธ์ด๋ง ๊ตฌ์กฐ, x86-64, ๋ ์ง์คํฐ
์ถ์ฒ : ๋๋ฆผํต ์์คํ
ํดํน ๋ก๋๋งต stage 2 https://dreamhack.io/ ์ ๋ฆฌ
๋ค์ด๊ฐ๋ฉฐ
์ค๋์ ์ปดํจํฐ ๊ตฌ์กฐ์ ISA(๋ช
๋ น์ด ์งํฉ ๊ตฌ์กฐ), x86-84์ ๋ํด ์์๋ณผ ๊ฒ์ด๋ค.
์ปดํจํฐ ๊ตฌ์กฐ
๊ฐ๋จํ๊ฒ ์๊ฐํด๋ณด์. ์ปดํจํฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฉ๋ชจ๋ฆฌ, ๊ทธ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด์์ ์ฐ์ฐํ๋ CPU, ๋คํธ์ํฌ ํต์ ์ ๋ค๋ฃจ๋ LAN ์นด๋, ์๋ฆฌ๋ฅผ ๋ค๋ฃจ๋ ์ฌ์ด๋ ์นด๋ ๋ฑ ์ฌ๋ฌ ๊ธฐ๋ฅ๋ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ธฐ๋ฅ๋ค์ด ์๋ก ์ํธ์์ฉํ๋ฉด์ ์ปดํจํฐ๋ผ๋ ํ๋์ ๊ธฐ๊ธฐ๋ฅผ ๋ง๋ค์ด๋ด๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ์ปดํจํฐ๋ฅผ ์ด๋ป๊ฒ ์ค๊ณํด์ ํ๋์ ๊ธฐ๊ธฐ๋ฅผ ๋ง๋ค์ด๋ด๋๋? ์์ ๊ทธ '์ค๊ณ'๋ฅผ ์ฐ๋ฆฌ๋ '์ปดํจํฐ ๊ตฌ์กฐ(์ํคํ
์ณ)'๋ผ๊ณ ํ ์ ์๊ฒ ๋ค.
- ๊ธฐ๋ฅ์ ๋ํ ์ค๊ณ: ์ด๋ป๊ฒ ์ฐ์ฐ์ ํจ์จ์ ์ผ๋ก ํ ๊ฒ์ธ๊ฐ? ๊ทธ๋ฌ๊ธฐ ์ํด์๋ ์ด๋ ํ ๊ธฐ๋ฅ๋ค์ด ํ์ํ๊ฐ?
ex) ํฐ ๋
ธ์ด๋ง ๊ตฌ์กฐ, (์์ ๋) ํ๋ฒ๋ ๊ตฌ์กฐ
- ๋ช
๋ น์ด ์งํฉ ๊ตฌ์กฐ(ISA) : CPU๊ฐ ํด์ํ๋ ๋ช
๋ น์ด์ ์งํฉ
-> ๋ช
๋ น์ด๊ฐ ์ด๋ค ๋ฐฉ์์ผ๋ก ๋์ด์๋์ง? -> CPU ๋ช
๋ น์ด์ ๋ํ ์ค๊ณ
- ๋ง์ดํฌ๋ก ์ํคํ
์ฒ(Micro Architecture)
-> CPU์ ํ๋์จ์ด์ ์ค๊ณ -> CPU ํ๋ก๋ฅผ ์ค๊ณํ๋ ๊ฒ
ํฐ ๋ ธ์ด๋ง ๊ตฌ์กฐ
ํฐ ๋
ธ์ด๋ง ๊ตฌ์กฐ๋ ์ปดํจํฐ์์ ๊ฐ์ฅ ์ ๋ช
ํ ๊ธฐ๋ฅ ๊ตฌ์กฐ!! ๊ทธ๋ฌ๋๊น ๊ธฐ๋ฅ ๊ตฌ์กฐ๊ฐ ์ด๋ฐ๊ฑฐ๋ค. ์ด๋ป๊ฒ ์ฐ์ฐ์ ๊ฐ์ฅ ํจ์จ์ ์ผ๋ก ๋น ๋ฅด๊ฒ ํ ์ ์๋์ง์ ๋ํ ์ค๊ณ!!
CPU(Centeral Processing Unit), ์ค์ ์ฒ๋ฆฌ ์ฅ์น
- ์ปดํจํฐ์ ๋๋! ์ฆ ์ฐ์ฐ์ ํ๋ ์ (๊ทธ๋ผ ์ฐ์ฐ์ ์ด๋ป๊ฒ~? ๋ช ๋ น์ด๋ก!! ์ด๊ฑด ์์ธํ ๊ณต๋ถ ํ์ํ ๋ฏ)
- ์ฐ์ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์, '๋ ์ง์คํฐ'๋ผ๋ ์์๋ณด๊ดํจ์ ๋ฃ์ด๋ฌ์ ํจ
- ALU(Arithmatic Logic Unit) : ์ฐ์ , ๋ ผ๋ฆฌ ์ฐ์ฐ
- CU(Control Unit) : CPU ์ ์ด
- Register/ Cache :๋ฉ๋ชจ๋ฆฌ์์ ๋ธ๊ผฌ์จ ๋ฐ์ดํฐ๋ค์ ๋๋๋ ๊ณณ
Memory, ๊ธฐ์ต์ฅ์น : ๊ทธ๋ฅ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ณณ
- ๋ง๊ทธ๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ณณ์ด๋ค
- ์ฃผ๊ธฐ์ต์ฅ์น(์์ ๊ธฐ์ต์ฅ์น!! ํ๋ก๊ทธ๋จ ์คํ์ ํ์ํ ๋ฐ์ดํฐ๋ค์ด ์ ์ฅ๋๋ค!! ์์๋ก~) ๋ํ์ ์ผ๋ก RAM(Random Access Memory)
- ๋ณด์กฐ ๊ธฐ์ต์ฅ์น - ์ฐ ๊ธฐ์ต ์ฅ์น๋ผ๊ณ ์๊ฐํ๋ฉด ํธํจ. ์ค๋๋์ ์ ์ฅํด์ผํ๋ ๋ฐ์ดํฐ๋ค์ ์ฌ๊ธฐ๋ค ์ ์ฅํจ ex) HDD(Hard Disk Drive), SSD(Solid State Drive)
Bus - ์ ์ก ๋ด๋นํ๋ ์
- ์ปดํจํฐ ๋ถํ๊ณผ ๋ถํ ์ฌ์ด ๋๋ ์ปดํจํฐ์ ์ปดํจํฐ ์ฌ์ด์ ์ ํธ๋ฅผ ์ ์กํ๋ ํต๋ก
- ๋ฐ์ดํฐ๊ฐ ์ด๋ํ๋ ๋ฐ์ดํฐ ๋ฒ์ค(Data Bus)
- ์ฃผ์๋ฅผ ์ง์ ํ๋ ์ฃผ์ ๋ฒ์ค(Address Bus)
- ์ฝ๊ธฐ/์ฐ๊ธฐ๋ฅผ ์ ์ดํ๋ ์ ์ด ๋ฒ์ค(Control Bus)
- ์ด ์ธ์๋ ๋์ ์ด๋ ๋ฐ์ดํฐ ์ ์ก ์ํํธ์จ์ด, ํ๋กํ ์ฝ ๋ฑ๋ ๋ฒ์ค๋ผ๊ณ ๋ถ๋ฆผ
๋ ์ง์คํฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋๋์ด์ ธ ์๋ ์ด์ ? -> CPU์ ์๋๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์๋๋ณด๋ค ํจ์ฌ ๋น ๋ฆ. ๊ทธ๋์ ๋ ์ง์คํฐ ์์ด ๊ทธ๋ฅ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒฝ์ฐ CPU๋ ๋น ๋ฅธ ์๋๋ฅผ ๊ฐ์ง๊ณ ์์์๋ ๋ถ๊ตฌํ๊ณ ๋ ธ๋ ์๊ฐ์ด ๋ง์์ง. ๊ทธ๋์ ๋ฐ๋ก ๋ ์ง์คํฐ๋ผ๊ณ ์์ ๊ธฐ์ต์ฅ์น๋ฅผ ๋ฌ์ ๊ฑ๋ค๊ฐ์ง๊ณ ์ฒ๋ฆฌํ๋ ๊ฒ
x86-64 ๊ตฌ์กฐ
ISA ์ํคํ
์ณ(๋ช
๋ น์ด ์งํฉ ๊ตฌ์กฐ/๊ท์น) ์ ํ๋๋ก ๊ฐ์ฅ ์ ๋ช
ํ๊ฒ!!
n ๋นํธ ์ํคํ
์ฒ๋?
- WORD : CPU๊ฐ ‘ํ๋ฒ์’ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐ์ดํฐ ํฌ๊ธฐ (์ฆ CPU๊ฐ ํ๋ฐฉ์ ์ดํดํ ์ ์๋ ๋ฐ์ดํฐ์ ๋จ์๋ผ๊ณ ๋ณด๋ฉด๋จ!!) → ์ด๊ฒ ํฌ๋ฉด ์ฑ๋ฅ์ด ์ข์ ๊ฑฐ๊ฒ ์ง? ์๋๋ฉด ํ ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋ ์์ด ๋ค๋ฅธ๊ฑฐ๋๊น! ex) 64bit, 32bit ์์ 64,32๊ฐ ๊ฐ๊ฐ WORD์. 64bit ์ํคํ ์ณ๋ CPU๊ฐ ํ๋ฒ์ 64bit์ ์ฒ๋ฆฌํ ์ ์๋ค๋ ์๋ฏธ!
- ์์ฆ pc๋ ๋๋ถ๋ถ 64bit
- ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ? -> cpu๊ฐ ‘ํ๋ก์ธ์ค’์ ์ ๊ณตํ๋ ๊ฐ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ (32bit ๋ณด๋ค 64bit๊ฐ ์ ๊ณตํ ์ ์๋ ๊ฐ์๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๊ฐ ํจ์ฌ ํผ(16์์ฌ ๋ฐ์ดํธ vs 4๊ธฐ๊ฐ ๋ฐ์ดํธ) ๋ฐ๋ผ์ 64bit๊ฐ ๋ ์กฐ์
- 32bit๋ฉด ๊ฐ์๋ฉ๋ชจ๋ฆฌ๊ฐ ์์์ ๊ณ ์ฌ์ ๊ฒ์ ๊ฐ์ ๊ฑด ์ด๋ ค์ธ ์๋ ์์
๋ ์ง์คํฐ
CPU๊ฐ ๋ฐ์ดํฐ๋ฅผ '๋น ๋ฅด๊ฒ' ์ ์ฅํ๊ณ ์ฌ์ฉํ๊ธฐ ์ํด ์ฌ์ฉํ๋ CPU์์ ์ฌ์ฉํ๋ ์์ ๋ณด๊ด์๋ผ๊ณ ๋ณด๋ฉด๋๋ค. (RAM์ด๋ ๋๋ ์ ธ ์๋ ์ด์ ๋ ์์์ ์ค๋ช
ํ์)
์ฐ์ ์ฐ์ฐ์ ํ์ํ ๋ฐ์ดํฐ๋ ์ฃผ์, ์ฐธ์กฐ ๋ฑ์ ์ฌ์ฉ๋จ
ex) x64์ ์๋ ๋ ์ง์คํฐ ์ข
๋ฅ: ๋ฒ์ฉ ๋ ์ง์คํฐ, ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ, ๋ช
๋ น์ด ํฌ์ธํฐ ๋ ์ง์คํฐ, ํ๋๊ทธ ๋ ์ง์คํฐ ๋ฑ
๋ฒ์ฉ ๋ ์ง์คํฐ ๐งบ
- 8๋ฐ์ดํธ ์ ์ฅ (64bit) (0~2^64-1)
- ์ฃผ์ฉ๋๊ฐ ์ ํด์ ธ ์๋ ๊ฒ๋ ์์ง๋ง ๋ค๋ฅธ ์ฉ๋๋ค๋ก๋ ์ฐ์
- ์๋์ ๊ฐ์ ์ ๋ค์ด ์๋ค!!
์ด๋ฆ | ์ฃผ์ฉ๋ |
rax | ํจ์ ๋ฐํ ๊ฐ |
rbx | x64์์๋ ์ฃผ๋ ์ฉ๋ x |
rcx | ๋ฐ๋ณต๋ฌธ์์ ๋ฐ๋ณตํ์(counter), ์ฐ์ฐ ์ํ ํ์ ๋ฑ |
rdx | x64์์๋ ์ฃผ๋ ์ฉ๋ x |
rsi(source index) | ๋ฐ์ดํฐ ์ฎ๊ธธ ๋ ์๋ณธ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ |
rdi(desination index) | ๋ฐ์ดํฐ ์ฎ๊ธธ ๋ ๋ชฉ์ ์ง ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ |
rsp(stack pointer) | ์คํ ์์น ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ |
rbp(stack base pointer) | ์คํ ๋ฐ๋ฅ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ |
์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ ๐๏ธ
- cs,ss,ds,es,fs,gs ์ด 6๊ฐ์ง ์กด์ฌ
- ํฌ๊ธฐ : 16bits (2 bytes)
๋ช ๋ น์ด ํฌ์ธํฐ ๋ ์ง์คํฐ ๐
- ํ๋ก๊ทธ๋จ์ ๊ธฐ๊ณ์ด ์ฝ๋๋ก ์ด๋ฃจ์ด์ ธ ์๋๋ฐ, CPU๊ฐ ์ด๋ ๋ถ๋ถ์ ์ฝ๋ ์ฌ์ฉํ ์ง ๊ฑฐ๊ธฐ๋ฅผ ๊ฐ๋ฆฌํค๋๊ฒ ๋ช ๋ น์ด ํฌ์ธํฐ ๋ ์ง์คํฐ!!
- rip๋ผ๊ณ ๋ถ๋ฆฌ๊ณ 8byte์
ํ๋๊ทธ ๋ ์ง์คํฐ ๐ด
- ํ๋ก์ธ์ค์ ํ์ฌ ์ํ๋ฅผ ์ ์ฅํ๊ณ ์๋ ๋ ์ง์คํฐ!
- 64bit์ด์ง๋ง ํ๋จ 20๊ฐ ์ ๋๋ง ์ฌ์ฉ
- ํ์ฌ ์ํ? ex) ์ฐ์ฐ๊ฒฐ๊ณผ ์์?(SF) 0? ๋นํธ๋ฒ์ ๋์ ๊ฒฝ์ฐ?(CF-๋ถํธ ์๋ ์/OF-๋ถํธ ์๋ )
๋ ์ง์คํฐ ํธํ
R?X๋ 64bit ๊ทธ ํ์ ์ ๋ฐ์ด E?X, ๋ ๊ทธ ์ ๋ฐ์ด AX....
rax=0xabcdefff12345678์ด๋ฉด ?
eax =0x12345678
ax = 0x5678
ah = 0x56 al=0x78
ํด์ฆ
0x0123456789abcdef๋ฅผ ๋ณด๋ฉด ํ๋์ ๋ฌธ์ (0,1,2,..)๋ ๊ฐ๊ฐ 16์ง์(4bit) ์ซ์์ด๋ค. ๊ทธ๋ฌ๋ฉด ๋๋ฌธ์๋ฅผ ํฉ์น๋ฉด ํ ๋ฐ์ดํธ๊ฐ ๋๋ฏ๋ก, 0x0123456789abcdef๋ 8byte(64bit) ์ซ์์ด๋ค.
al๋ ํ์ 1byte์ด๋ฏ๋ก 0xef์ด๋ค.
ax๋ ํ์ 2byte์ด๋ฏ๋ก 0xcdef์ด๋ค
ZF(Zero Flag)๋ ํ๋๊ทธ ๋ ์ง์คํฐ(ํ๋ก์ธ์ค ์ํ ๋ํ๋)์ ํ๋๊ทธ๋ก ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ 0์ผ๋ ์ค์ ๋๋ค.
๋ฐ๋ผ์ ๋ต์ C!
rax์ ์๋์ชฝ๋ฐ๋ต์ด eax ์ด๋ฏ๋ก eax=0x89abcdef์ด๋ค
0xcdef๊ฐ ax์ด๊ณ ์ฌ๊ธฐ ์์ 1byte๊ฐ ah์ด๋ฏ๋ก ah๋ 0xcd์ด๋ค.