์คํ๐งฑ(push, pop)
- push val : val์ ์คํ ์ต์๋จ์ ์์
์ฐ์ฐ
rsp -= 8
[rsp] = val
- pop reg : ์คํ ์ต์๋จ์ ๊ฐ์ ๊บผ๋ด์ reg์ ๋์
์ฐ์ฐ
rsp += 8
reg = [rsp-8]
์ฃผ์ํ ์ โ ๏ธ
1) ์คํ์ ํ์ฅ๋ ๋ ์ฃผ์๊ฐ์ด ๋ฎ์์ง๊ณ , ์ถ์๋ ๋ ์ฃผ์๊ฐ์ด ๋์์ง๋ค๋ ๊ฑธ ์ ๋ ํ์(์คํ์ ์๋๋ก ์๋๋ค)
2) push์ pop ๋ช ๋ น์ด๋ ํ์ฌ rsp๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ ๊ธฐ์ค์ผ๋ก ์ด๋ฃจ์ด์ง๋ค๋ ๊ฒ์ ์ ๋ ํ์
3) pop ๋ช ๋ น์ด๋ ์คํ ์ต์๋จ์ ๊ฐ์ ๊บผ๋ธ ๋ค, ๋์ ๊น์ง ํ๋ค๋ ๊ฑธ ์์ง ๋ง์
ํ๋ก์์ ๐(call, leave, ret)
ํ๋ก์์ ๋ฅผ ๋ถ๋ฅด๋ ํ์๋ฅผ ํธ์ถ(Call)์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ํ๋ก์์ ์์ ๋์์ค๋ ๊ฒ์ ๋ฐํ(Return)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
x64์ด์ ๋ธ๋ฆฌ์ธ์ด์๋ ํ๋ก์์ ์ ํธ์ถ๊ณผ ๋ฐํ์ ์ํ call, leave, ret ๋ช ๋ น์ด๊ฐ ์๋ค.
CALL๐
- call addr : addr์ ์์นํ ํ๋ก์์ ธ ํธ์ถ
์ฐ์ฐ
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์ด ์คํ๋์
1) ์คํ์ ๋์๊ฐ์ผ ํ ์ฃผ์(๋ค์ ๋ช ๋ น์ด๊ฐ ์กด์ฌํ๋ ์ฃผ์)์ธ 0x400005๊ฐ ์คํ์ push(== 1. rsp -= 8 2. push val) ๋๊ณ
2) rip๊ฐ call๋ ์ฃผ์์ธ 0x401000์ผ๋ก ์ฎ๊ฒจ๊ฐ์(jmp)์ ํ์ธํ ์ ์๋ค.
LEAVE๐
- leave: ์คํํ๋ ์ ์ ๋ฆฌ (์คํ ํ๋ ์ == ํจ์๋ณ๋ก ์๋ก๊ฐ ์ฌ์ฉํ๋ ์คํ์ ์์ญ์ ๋ช ํํ ๊ตฌ๋ถํด์ฃผ๋ ๊ฒ.
-> ์ด๋, ํจ์๋ง๋ค ์ฌ์ฉํ๋ ์คํ์ ์์ญ์ด ๋ค๋ฆ์ ์๋ฏธํ๋ค)
์ฐ์ฐ
mov rsp, rbp
pop rbp
์์
[Register]
rsp = 0x7fffffffc400
rbp = 0x7fffffffc480
[Stack]
0x7fffffffc400 | 0x0 <= rsp
...
0x7fffffffc480 | 0x7fffffffc500 <= rbp
0x7fffffffc488 | 0x31337
[Code]
leave
๊ฒฐ๊ณผ
[Register]
rsp = 0x7fffffffc488
rbp = 0x7fffffffc500
[Stack]
0x7fffffffc400 | 0x0
...
0x7fffffffc480 | 0x7fffffffc500
0x7fffffffc488 | 0x31337 <= rsp
...
0x7fffffffc500 | 0x7fffffffc550 <= rbp
*์์ ์ ๊ฒฐ๊ณผ๋ฅผ ํตํด leave๊ฐ ์คํ๋์
1) mov rsp, rbp๋ฅผ ํตํด, rsp์ ๊ฐ์ด rbp์ ๊ฐ์ธ 0x7fffffffc480์ผ๋ก ๋ฐ๋ ํ
2) pop rbp๋ฅผ ํตํด, rsp๊ฐ ํ์ฌ ๊ฐ๋ฆฌํค๋ ์ฃผ์์ธ '0x7fffffffc480'์ ๊ฐ์์ 8 ์ฆ๊ฐํ ํ(x64 ๋ ์ง์คํฐ์ธ rsp ๊ธฐ์ค, pop์ ์คํํ๋ฉด rsp์ ์ฃผ์๊ฐ 8 ์ฆ๊ฐํ๋ฉฐ rsp๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ [ํผ์ฐ์ฐ์]์ ์ ์ฅํ๋ค)
3) rsp๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์์ธ '0x7fffffffc480'์ ๋ฐ์ดํฐ์ธ '0x7fffffffc500'์ด rbp์ ๋์ ๋์์์ ์ ์ ์๋ค
RET๐
- ret : return address๋ก ๋ฐํ
์ฐ์ฐ
pop rip
์์
[Register]
rip = 0x401008
rsp = 0x7fffffffc3f8
[Stack]
0x7fffffffc3f8 | 0x400005 <= rsp
0x7fffffffc400 | 0
[Code]
0x400000 | call 0x401000
0x400005 | mov esi, eax
...
0x401000 | mov rbp, rsp
...
0x401007 | leave
0x401008 | ret <= rip
๊ฒฐ๊ณผ
[Register]
rip = 0x400005
rsp = 0x7fffffffc400
[Stack]
0x7fffffffc3f8 | 0x400005
0x7fffffffc400 | 0x0 <= rsp
[Code]
0x400000 | call 0x401000
0x400005 | mov esi, eax <= rip
...
0x401000 | mov rbp, rsp
...
0x401007 | leave
0x401008 | ret
*์์ ์ ๊ฒฐ๊ณผ๋ฅผ ํตํด,
1) pop rip๊ฐ ์ํ๋์ด
2) rsp์ ๊ฐ์ด 8 ์ฆ๊ฐ๋๊ณ
3) rsp๊ฐ ์๋ ๊ฐ๋ฆฌํค๋ ์ฃผ์์ธ '0x7fffffffc3f8'์ ์ ์ฅ๋ผ์๋ ๋ฐ์ดํฐ์ธ '0x400005'๊ฐ rip์ ๋์ ๋์ด
4) rip๊ฐ call ๋๊ธฐ ์ ํจ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ํํ๊ธฐ ์ํด return ๋์์์ ์ ์ ์๋ค
์ด๋ฅผ ๋ ์ ์ดํดํ๊ธฐ ์ํด์๋,
1. ์คํ ํ๋ ์
2. ํจ์ ํ๋กค๋ก๊ทธ, ์ฝ, ์ํ๋ก๊ทธ
๋ฅผ ๊ฒ์ํด ์ค์ค๋ก ๋ ๊ณต๋ถํด๋ด์ผ ํ๋ค
์์คํ ์ฝ๐
์๋ก
์ด์์ฒด์ ๋ ์ฐ๊ฒฐ๋ ๋ชจ๋ ํ๋์จ์ด ๋ฐ ์ํํธ์จ์ด์ ์ ๊ทผํ ์ ์์ผ๋ฉฐ, ์ด๋ค์ ์ ์ดํ ์๋ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํดํน์ผ๋ก๋ถํฐ ์ด ๋ง๊ฐํ ๊ถํ์ ๋ณดํธํ๊ธฐ ์ํด ์ปค๋ ๋ชจ๋์ ์ ์ ๋ชจ๋๋ก ๊ถํ์ ๋๋๋๋ค.
- ์ปค๋ ๋ชจ๋๋ ์ด์์ฒด์ ๊ฐ ์ ์ฒด ์์คํ ์ ์ ์ดํ๊ธฐ ์ํด ์์คํ ์ํํธ์จ์ด์ ๋ถ์ฌํ๋ ๊ถํ์ ๋๋ค. ํ์ผ์์คํ , ์ ๋ ฅ/์ถ๋ ฅ, ๋คํธ์ํฌ ํต์ , ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฑ ๋ชจ๋ ์ ์์ค์ ์์ ์ ์ฌ์ฉ์ ๋ชจ๋ฅด๊ฒ ์ปค๋ ๋ชจ๋์์ ์งํ๋ฉ๋๋ค. ์ปค๋ ๋ชจ๋์์๋ ์์คํ ์ ๋ชจ๋ ๋ถ๋ถ์ ์ ์ดํ ์ ์๊ธฐ ๋๋ฌธ์, ํด์ปค๊ฐ ์ปค๋ ๋ชจ๋๊น์ง ์ง์ ํ๊ฒ ๋๋ฉด ์์คํ ์ ๊ฑฐ์ ๋ฌด๋ฐฉ๋น ์ํ๊ฐ ๋ฉ๋๋ค.
- ์ ์ ๋ชจ๋๋ ์ด์์ฒด์ ๊ฐ ์ฌ์ฉ์์๊ฒ ๋ถ์ฌํ๋ ๊ถํ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด์ฉํ์ฌ ์นํ์ด์ง๋ฅผ ๋ณด๊ฑฐ๋, ์ ํ๋ธ๋ฅผ ์์ฒญํ๋ ๊ฒ, ๊ฒ์์ ํ๊ณ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ ๊ฒ ๋ฑ์ ๋ชจ๋ ์ ์ ๋ชจ๋์์ ์ด๋ฃจ์ด์ง๋๋ค. ๋ฆฌ๋ ์ค์์ ๋ฃจํธ ๊ถํ์ผ๋ก ์ฌ์ฉ์๋ฅผ ์ถ๊ฐํ๊ณ , ํจํค์ง๋ฅผ ๋ด๋ ค ๋ฐ๋ ํ์ ๋ฑ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์ ์ ๋ชจ๋์์๋ ํดํน์ด ๋ฐ์ํด๋, ํด์ปค๊ฐ ์ ์ ๋ชจ๋์ ๊ถํ๊น์ง ๋ฐ์ ํ๋ํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ํด์ปค๋ก ๋ถํฐ ์ปค๋์ ๋ง๊ฐํ ๊ถํ์ ๋ณดํธํ ์ ์์ต๋๋ค.
์์คํ ์ฝ(system call, syscall)
์ ์ ๋ชจ๋์์ ์ปค๋ ๋ชจ๋์ ์์คํ
์ํํธ์จ์ด์๊ฒ ์ด๋ค ๋์์ ์์ฒญํ๊ธฐ ์ํด ์ฌ์ฉ.
๋์์ด ํ์ํ๋ค๋ ์์ฒญ์ ์์คํ
์ฝ์ด๋ผ๊ณ ํจ.
์ ์ ๋ชจ๋์ ์ํํธ์จ์ด๊ฐ ํ์ํ ๋์์ ์์ฒญํ๋ฉด, ์ปค๋์ด ์์ฒญํ ๋์์ ์ํํ์ฌ ์ ์ ์๊ฒ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํด์ค.
๋ฆฌ๋
์ค์์๋ x64์ํคํ
์ณ์์ rax๋ก ๋ฌด์จ ์์ฒญ์ธ์ง ๋ํ๋ด๊ณ , ์๋์ ์์๋๋ก ํ์ํ ์ธ์๋ฅผ ์ ๋ฌ
์ธ์ ์์: rdi → rsi → rdx → rcx → r8 → r9 → stack
ํด์
syscall ํ ์ด๋ธ
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 |
syscall table์ ๋ณด๋ฉด, rax๊ฐ 0x1์ผ ๋, ์ปค๋์ write ์์คํ
์ฝ์ ์์ฒญํฉ๋๋ค. ์ด๋ rdi, rsi, rdx๊ฐ 0x1, 0x401000, 0xb ์ด๋ฏ๋ก ์ปค๋์ write(0x1, 0x401000, 0xb)๋ฅผ ์ํํ๊ฒ ๋ฉ๋๋ค.
writeํจ์์ ๊ฐ ์ธ์๋ ์ถ๋ ฅ ์คํธ๋ฆผ, ์ถ๋ ฅ ๋ฒํผ, ์ถ๋ ฅ ๊ธธ์ด๋ฅผ ๋ํ๋
๋๋ค. ์ฌ๊ธฐ์ 0x1์ stdout์ด๋ฉฐ, ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋ฉด์ ์๋ฏธํฉ๋๋ค. 0x401000์๋ Hello World๊ฐ ์ ์ฅ๋์ด ์๊ณ , ๊ธธ์ด๋ 0xb๋ก ์ง์ ๋์ด ์์ผ๋ฏ๋ก, ํ๋ฉด์ Hello World๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
'DreamHack: System Hacking > F Stage 2' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Quiz: x86 Assembly 2 (0) | 2023.03.31 |
---|---|
Quiz: x86 Assembly 1 (0) | 2023.03.31 |
Background: x86 Assembly Essential Part(1) ์ด์ ๋ธ๋ฆฌ ๋ช ๋ น์ด (0) | 2023.03.31 |
Quiz: Linux Memory Layout (0) | 2023.03.31 |
Background: Linux Memory Layout (0) | 2023.03.31 |