๋ฌธ์ : DreamHack โ Long Sleep ๋ถ๋ฅ: Reversing ๋์ด๋: ๐ฅ Silver 4 FLAG:
DH{406b2742ffb2a6cac02abb8f303fa12067f8061339979855108ce4a2e38ef558}
์ด ๋ฌธ์ ๋ ์ธ ๋ฒ์งธ ์๋ ๋ง์ ํ๋ ธ๋ค. ์ง๋ ๋ ์ธ์ ์ ํ์ผ ํจ์น, ์ํํธ์จ์ด ๋ธ๋ ์ดํฌํฌ์ธํธ, ptrace ๋ ์ง์คํฐ ์กฐ์์ ์์๋๋ก ์๋ํ๋ค๊ฐ ์ ๋ถ ๋งํ์ "ํ์ด๋ฐ ๊ธฐ๋ฐ ์ํฐํ ํผ์ผ ๊ฒ"์ด๋ผ๋ ์ถ์ธก๋ง ๋จ๊ธฐ๊ณ ๋ณด๋ฅํ๋ค. ์ค๋ ๋ค์ ๋ถ์ด ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ฒ์๋ถํฐ ์ ๋๋ก ์ฝ์ด๋ณด๋, ์ ์ด์ "์ํฐํ ํผ๊ฐ ํ๋"๋ผ๋ ์ ์ ์์ฒด๊ฐ ํ๋ ค ์์๋ค โ ์ด ํ๋ก๊ทธ๋จ์ ์๋ก ์์ ํ ๋ฌด๊ดํ ๋ ๊ฐ์ ๋ฐฉ์ด๋ฅผ ๊ฒน์ณ ๊ฐ๊ณ ์์๋ค.
๋ฌธ์ ๊ฐ์
์คํํ๋ฉด ์ด๋ ๊ฒ ํ๋ฌ๊ฐ๋ค.
$ ./prob
Wait! I'm generating flag!!
(... ํ์ฐธ ๋ฉ์ถค ...)
Here's your flag: DH{...}file/checksec๋ก ๋ณดํธ๊ธฐ๋ฒ๋ถํฐ ํ์ธํ๋ค. PIE, Full RELRO, ์นด๋๋ฆฌ, NX, SHSTK/IBT(CET)๊น์ง ์ผ์ง ์ต์ ๋น๋ ์กฐํฉ์ด๋ค. strings๋ก ๋ฝ์๋ณด๋ฉด ์์ผ๋ก ๋ง์ฃผ์น ๋ชจ๋ ๋ฌธ๊ตฌ๊ฐ ์ด๋ฏธ ๋ค ๋์ ์๋ค โ "์์ฑ ์ค" ์๋ด, flag ์ ๋์ด, ๊ทธ๋ฆฌ๊ณ ์ํฐํ
ํผ ์คํจ ๋ฉ์์ง.
โถ๐ณ๏ธ ์ฝ์ง โ ์ง๋ ๋ ์ธ์ , 'ํ๋์ ๋ฐฉ์ด'๋ผ๊ณ ์ฐฉ๊ฐํ๊ณ ๊ณ์ ๋งํ๋ค
๊ทธ๋์์ ์๋๋ฅผ ์์๋๋ก ๋ค์ ์ ๋ฆฌํ๋ฉด ์ด๋ ๋ค.
์๋ 1 โ ํ์ผ์ ์ง์ ํจ์น. syscall ๋ช
๋ น(0f 05) ๋ ๋ฐ์ดํธ๋ฅผ nop(90 90)์ผ๋ก ๋ฐ๊ฟ ์คํ ํ์ผ ์์ฒด๋ฅผ ์์ ํ ๋ค ์คํํ๋ค. sleep ์์ฒด๋ฅผ ์์ ์์ ๋ฒ๋ฆฌ๋ฉด ๋์ง ์์๊น ํ๋ ๋จ์ํ ๋ฐ์์ด์๋ค. ๊ฒฐ๊ณผ๋ ๊ณง๋ฐ๋ก *** assertin failed *** integrity_check(): file has been corrupted. โ sleep์ด ์์๋๊ธฐ๋ ์ ์, ๊ฑฐ์ ์ฆ์ ์คํจํ๋ค.
์๋ 2 โ gdb ์ํํธ์จ์ด ๋ธ๋ ์ดํฌํฌ์ธํธ๋ก syscall ๊ฑด๋๋ฐ๊ธฐ. break *<syscall์ฃผ์> ๋ฅผ ๊ฑธ๊ณ ๋ช
๋ น์ด๋ฅผ ๊ฑด๋๋ฐ๋ ๋ฐฉ์์ ์๋ํ๋ค. ์ด๊ฒ๋ ๋๊ฐ์ด ์ฆ์ corrupted๊ฐ ๋ด๋ค.
์๋ 3 โ ptrace๋ก ๋ ์ง์คํฐ๋ง ์กฐ์(๋ฉ๋ชจ๋ฆฌ ํจ์น ์์ด). syscall ์ง์
์ง์ ์์ $rax/$orig_rax๋ฅผ 39(getpid)๋ก ๋ฐ๊ฟ์น๊ธฐํด์ nanosleep ๋์ ์ฆ์ ๋๋๋ syscall์ ๋์ ์คํ์ํค๋ ค ํ๋ค. ์ด๋ฒ์ corrupted๊ฐ ๋จ์ง ์์์ง๋ง, ๊ด์ฐฐ์ด ์ด์ํ๊ฒ ๋ถ์์ ํ๋ค โ catch๊ฐ ๊ณ์ ๋ฐ๋ณต๋๊ธฐ๋ง ํ๊ณ ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ๋ ๋๋์ด ์์๋ค.
์ธ ๋ฒ์ ์๋๋ฅผ ๊ฒช๊ณ ๋์ "corrupted๊ฐ ๋จ๋ ์กฐ๊ฑด๊ณผ ๋จ์ง ์๋ ์กฐ๊ฑด" ์ฌ์ด์ ์ฐจ์ด๋ฅผ timing์ผ๋ก ํด์ํ๋ค โ "์ค์ ๊ฒฝ๊ณผ ์๊ฐ์ ์ฌ๋ ๊ฒ์ฆ์ผ ๊ฒ"์ด๋ผ๋ ์ถ์ธก์ด์๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด ์ถ์ธก์ ํ๋ ธ๋ค. ์ด๋ฒ์ main์ ์ฒ์๋ถํฐ ๋ค์ ์ฝ๊ณ ๋์์ผ ์ง์ง ๊ตฌ์กฐ๊ฐ ๋ณด์๋ค.
๋์ค์ด์
๋ธ๋ฆฌ๋ฅผ ๋ฐ๋ผ๊ฐ ๋ณด๋ฉด, ELF์ .init_array(์์ฑ์ ๋ชฉ๋ก)์ ํจ์๊ฐ ๋ ๊ฐ ๋ฑ๋ก๋์ด ์๋ค.

์ฒซ ๋ฒ์งธ(0x1220)๋ ํํ register_tm_clones ํธ๋จํด๋ฆฐ์ด๊ณ , ๋ ๋ฒ์งธ(0x1229)๊ฐ ์ง์ง ์ฝ๋๋ค. ์ด ํจ์๋ main()์ด ์์๋๊ธฐ๋ ์ ์ โ glibc๊ฐ ํ๋ก๊ทธ๋จ ์์ ์ ์๋์ผ๋ก ์คํํ๋ ์์ฑ์๋ก์ โ ์๊ธฐ ์์ ์ ์ฝ๋ ์์ญ 0x1367๋ถํฐ 0x1000๋ฐ์ดํธ(4096๋ฐ์ดํธ, main ํจ์์ flag ์์ฑ ๋ก์ง, sleep ํจ์๊น์ง ์ ๋ถ ํฌํจํ๋ ๋ฒ์)๋ฅผ SHA256์ผ๋ก ํด์ํ ๋ค, ๋ฐ์ด๋๋ฆฌ์ ํ๋์ฝ๋ฉ๋ 32๋ฐ์ดํธ ๊ฐ๊ณผ memcmp๋ก ๋น๊ตํ๋ค. ๋ค๋ฅด๋ฉด ๊ทธ ์๋ฆฌ์์ corrupted ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ exit(-1).
์ฆ ์ด ๊ฒ์ฌ๋ ํ์ด๋ฐ๊ณผ ์๋ฌด ๊ด๊ณ๊ฐ ์๋ค. ํ์ผ์ ํจ์นํ๋ฉด ๊ทธ ๋ณ์กฐ๊ฐ ์ฝ๋ ์์ญ์ ๊ทธ๋๋ก ๋จ์ ํด์๊ฐ ๋ฌ๋ผ์ง๊ณ , gdb ์ํํธ์จ์ด ๋ธ๋ ์ดํฌํฌ์ธํธ๋ ๋์ ์ฃผ์์ 0xCC ๋ฐ์ดํธ๋ฅผ ์ค์ ๋ก ์จ๋ฃ๊ธฐ ๋๋ฌธ์ ๋๊ฐ์ด ํด์๊ฐ ์ด๊ธ๋๋ค โ ๋ ๋ค sleep์ด ํ ๋ฒ๋ ์คํ๋๊ธฐ ์ , ํ๋ก๊ทธ๋จ์ด ์์๋์๋ง์ ์คํจํ๋ ๊ฒ ๋น์ฐํ๋ค. ๋ฐ๋๋ก ์๋ 3(๋ ์ง์คํฐ๋ง ๋ฐ๊พธ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ ์ ๊ฑด๋๋ฆผ)์ด corrupted๋ฅผ ์ ๋ฐํ์ง ์์๋ ๊ฒ๋ ์ด ๊ฐ์ค๊ณผ ์ ํํ ๋ค์ด๋ง๋๋ค โ ๊ทธ๊ฑด ๊ด์ฐฐ์ด ์๋ชป๋ ๊ฒ ์๋๋ผ ์ ์ด์ ์ณ์ ๋ฐฉํฅ์ด์๋ค. ๋ค๋ง ๋ ์ง์คํฐ ์กฐ์ ๋ฐฉ์ ์์ฒด์ ๋ค๋ฅธ ๋ฒ๊ทธ๊ฐ ์์์ ๋ฟ์ด๋ค(๋ค์์ ๋ค์ ๋์จ๋ค).
๐ฃ ํต์ฌ 1 โ ์์ฒด ์ฝ๋ ํด์์ ์คํ ์๋๋ ์๋ก ๋ค๋ฅธ ์ธต์ด๋ค
์ ๋ฆฌํ๋ฉด ์ด ๋ฐ์ด๋๋ฆฌ๋ ๋ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ๋ฐฉ์ด๋ฅผ ๊ฐ๊ณ ์๋ค.
- ์ ์ ๋ฐฉ์ด (์์ฑ์,
main์ด์ ): ์๊ธฐ ์ฝ๋ 4096๋ฐ์ดํธ์ SHA256์ ๊ณ์ฐํด ํ๋์ฝ๋ฉ๋ ๊ฐ๊ณผ ๋น๊ต. ์ฝ๋ ๋ฐ์ดํธ๊ฐ ์กฐ๊ธ์ด๋ผ๋ ๋ฐ๋๋ฉด ์คํจ. ์๊ฐ๊ณผ๋ ๋ฌด๊ด. - ๋์ ๋ฐฉํด (SHA256 ์์ถ ํจ์ ์):
syscall(SYS_nanosleep, ...)์ PLT๋ libc ์ฌ๋ณผ์ ๊ฑฐ์น์ง ์๊ณ ์ง์ ํธ์ถ. ๋งค 64๋ฐ์ดํธ ๋ธ๋ก์ ์ฒ๋ฆฌํ ๋๋ง๋ค ํ ๋ฒ์ฉ, ์ ์ญ ์นด์ดํฐ๋ฅผN โ 2*(N+1)๋ก ๋ถ๋ ค๊ฐ๋ฉฐtv_sec์ ๊ทธ ๊ฐ์ ์ฑ์ ๋ฃ๋๋ค.
syscall ๋ช
๋ น์ ์ง์ ์ด๋ค๋ ์ ์ด ์ค์ํ๋ค. ์ผ๋ฐ์ ์ธ sleep()/nanosleep() ํธ์ถ์ด์๋ค๋ฉด LD_PRELOAD๋ก libc ์ฌ๋ณผ์ ๊ฐ๋ก์ฑ๋ ํํ ์ฐํ๊ฐ ํตํ๊ฒ ์ง๋ง, ์ด ์ฝ๋๋ PLT ์์ฒด๋ฅผ ๊ฑฐ์น์ง ์์ผ๋ฏ๋ก ํํนํ ์ฌ๋ณผ์ด ์๋ค โ ์ค์ ๋ก ์ง๋๋ฒ์ LD_PRELOAD๋ก ptrace()๋ฅผ ๋ฌด๋ ฅํํ๋ ์๋๊ฐ ์ด syscall์ ์๋ฌด ์ํฅ์ ์ฃผ์ง ๋ชปํ๋ ์ด์ ์ด๊ธฐ๋ ํ๋ค(๊ทธ๊ฑด ๋ค๋ฅธ ํจ์ ์๊ธฐ์์ง๋ง, ๊ฐ์ ๋งฅ๋ฝ์ ํจ์ ์ด๋ค).
์ด sleep ํจ์๋ ์ด๋์ ํธ์ถ๋ ๊น ๊ถ๊ธํด์ ํธ์ถ์๋ฅผ ๊ณ์ ๋ฐ๋ผ ์ฌ๋ผ๊ฐ๋๋, ๋๋๊ฒ๋ main์ด ๊ณ์ฐํ๋ "flag"์ ์ ์ฒด๊ฐ ๋๋ฌ๋ฌ๋ค. main์ sha256_init โ sha256_update(ctx, "I will evolve into SUPER FLAG!!!!", 33) โ sha256_final์ ์์๋๋ก ํธ์ถํด์ ๋์จ 32๋ฐ์ดํธ ๋ค์ด์ ์คํธ๋ฅผ 64์ hex๋ก ์ถ๋ ฅํ ๋ฟ์ด๋ค. flag๋ ๊ทธ๋ฅ ๊ณ ์ ๋ฌธ์์ด์ SHA256์ด๋ค. ๊ทธ๋ฆฌ๊ณ sleep ํธ์ถ์ ์ด SHA256์ ์์ถ ํจ์(64๋ฐ์ดํธ ๋ธ๋ก ํ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ) ์์ ๋ผ์ ๋ฃ์ด์ ธ ์๋ค โ ๊ณ์ฐ ๋ก์ง ์์ฒด์๋ ์๋ฌด ์๊ด์ด ์๊ณ , ๊ทธ์ "๋ธ๋ก ํ๋ ์ฒ๋ฆฌํ ๋๋ง๋ค ๋๊ธฐ์ํค๋" ํผ๋ฐฉ๊พผ์ผ๋ก ์ฝ์
๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์์ฑ์(0x1229)๋ ์๊ธฐ ์์ ์ ๊ฒ์ฆํ๊ธฐ ์ํด 4096๋ฐ์ดํธ(64๋ธ๋ก)๋ฅผ ๊ฐ์ SHA256 ์์ถ ํจ์๋ก ํด์ํ๋ค โ ์ฆ ์์ฑ์ ์์ ๋ ์ด sleep ํญํ์ ๋ฐ๋๋ค. ๋ ๊ฒ์ฌ(์์ฒด ํด์ + flag ๊ณ์ฐ)๋ฅผ ํฉ์น๋ฉด sleep์ด ์ด 96๋ฒ ๊ฑธ๋ฆฐ๋ค๋ ๊ฑธ ๋์ค์ ์ค์ธก์ผ๋ก ํ์ธํ๋ค.
๐ฏ ์์ฒด ์๊ฒฐ solve
๋ฐฉํฅ์ ๋ช
ํํด์ก๋ค. ์ฝ๋ ๋ฐ์ดํธ๋ ํ ๊ธ์๋ ๊ฑด๋๋ฆฌ์ง ๋ง๊ณ , syscall์ด ์ฝ์ด๊ฐ timespec ์ธ์๊ฐ๋ง ์กฐ์ํ๋ค. gdb์ catch syscall์ ์ปค๋ PTRACE_SYSCALL ๋ฉ์ปค๋์ฆ์ ์ฐ๊ธฐ ๋๋ฌธ์ ์ํํธ์จ์ด ๋ธ๋ ์ดํฌํฌ์ธํธ(0xCC)์ ๋ฌ๋ฆฌ .text์ ์ด๋ค ๋ฐ์ดํธ๋ ์ฐ์ง ์๋๋ค โ ์์ฒด ์ฝ๋ ํด์ ๊ฒ์ฆ์ ๊ฑด๋๋ฆด ์ด์ ๊ฐ ์๋ค.
def on_stop(event):
orig_rax = int(gdb.parse_and_eval("$orig_rax"))
if orig_rax != 35: # SYS_nanosleep
return
rdi = int(gdb.parse_and_eval("$rdi")) # timespec* ์ธ์
gdb.execute(f"set variable *(long*){rdi} = 0")
gdb.execute(f"set variable *(long*)({rdi}+8) = 1000")
gdb.events.stop.connect(on_stop)
gdb.execute("catch syscall nanosleep")
gdb.execute("run < /dev/null")์ฒ์ ์ด ์คํฌ๋ฆฝํธ๋ฅผ ๋๋ ธ์ ๋, $rax๋ก syscall ๋ฒํธ๋ฅผ ํ์ธํ๋ ์กฐ๊ฑด(if rax == 35)์ ์ผ๋๋ฐ ๊ณ์ ์๋ฌด ๊ฒ๋ ํจ์น๋์ง ์๊ณ ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถฐ๋ฒ๋ ธ๋ค.
rax=-38. -38์ -ENOSYS๋ค. ์ฌ๊ธฐ์ ์ง๋๋ฒ์ ์ ํํ ๊ฑธ๋ ค ๋์ด์ก๋ ๊ทธ ํจ์ ์ ๋ค์ ๋ง๋ฌ๋ค โ ptrace์ syscall-enter ์ ์ง ์์ ์๋ $rax๊ฐ ์์ง ์ง์ง syscall ๋ฒํธ๋ฅผ ๋ด๊ณ ์์ง ์๋ค. ์ปค๋์ ์ด ์์ ์ rax๋ฅผ -ENOSYS ํ๋ ์ด์คํ๋๋ก ์ฑ์๋๊ณ , ์ง์ง syscall ๋ฒํธ๋ ๋ณ๋์ $orig_rax ๋ ์ง์คํฐ์ ๋ฃ์ด๋๋ค(์ด๊ฑด x86-64 ptrace์ ์ ์๋ ค์ง ๋์์ด๋ค โ syscall-enter/exit์ด ๊ฐ์ ์ ์ง ์ด๋ฒคํธ๋ก ๊ฒน์ณ ๋ณด์ด๊ธฐ ๋๋ฌธ์, "์ด๊ฒ ์ง๊ธ ๋ค์ด๊ฐ๋ ์ค์ธ์ง ๋๊ฐ๋ ์ค์ธ์ง"๋ฅผ ์ปค๋์ด ์ด๋ฐ ๋ฐฉ์์ผ๋ก ๊ตฌ๋ถํด์ค๋ค). $orig_rax๋ก ๋ฐ๊พธ์๋ง์ ์ ์ ๋์ํ๋ค.
ํจ์น๋ ํธ์ถ์ ์ ํํ 96๋ฒ์ด์๋ค. ์ด๊ฒ ์ผ๋ง๋ ํฐ ์ซ์์ธ์ง ๊ฐ์ ์ก์ผ๋ ค๊ณ , ์ฐํ ์์ด ์ด ์์ด์ ์ค์ ๋ก ๋ค ๊ธฐ๋ค๋ ธ๋ค๋ฉด ๊ฑธ๋ ธ์ ์๊ฐ์ ๊ณ์ฐํด๋ดค๋ค.
์ฐํ ์์ด ๋ค ๊ธฐ๋ค๋ ธ๋ค๋ฉด ์ฝ 10ยฒยฒ๋ โ ์ฐ์ฃผ ๋์ด(์ฝ 1.4ร10ยนโฐ๋ )๋ณด๋ค 10ยนยฒ๋ฐฐ ์ด์ ๊ธด ์๊ฐ์ด๋ค. ์ค์ ์ฐํ ์คํ์ 0.32์ด๋ง์ ๋๋ฌ๋ค. "๋ช ํ์ฐจ๊น์ง๋ ๋ฒํธ ๋งํ์ง ์์๊น"๋ผ๋ ์ง๋๋ฒ ๋ง์ง๋ง ๋ฉ๋ชจ๋, ์ ํํ ํ์ธํด๋ณด๋ ์ ์ด์ ์ฑ๋ฆฝํ ์ ์๋ ์ง๋ฌธ์ด์๋ค.
Wait! I'm generating flag!!
Here's your flag: DH{406b2742ffb2a6cac02abb8f303fa12067f8061339979855108ce4a2e38ef558}์ด flag๋ฅผ ๋๋ฆผํต์ ์ ์ถํด "์ ๋ต! ํด๊ฒฐ ์ฒ๋ฆฌ๋จ"์ผ๋ก ํ์ ๋๋ค.
๐ ๊ฒฐ๋ก
์ด ๋ฌธ์ ๊ฐ ์ค ๊ตํ์ ๋ ๊ฐ์ง ์ธต์๋ก ๋๋๋ค.
- "์ํฐํ
ํผ์ฒ๋ผ ๋ณด์ด๋ ์คํจ"๊ฐ ์ ๋ถ ๊ฐ์ ์์ธ์ด๋ผ๊ณ ๊ฐ์ ํ์ง ๋ง์์ผ ํ๋ค. ํ์ผ ํจ์น์ ์ํํธ์จ์ด ๋ธ๋ ์ดํฌํฌ์ธํธ๊ฐ ๋๊ฐ์ด
corrupted๋ฅผ ์ ๋ฐํ์ ๋, ๊ทธ ๊ณตํต์ ์ด "๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฑด๋๋ ธ๋ค"๋ ์ฌ์ค์ด์์ ๋ฟ "ํ์ด๋ฐ์ด ํํธ๋ฌ์ก๋ค"๋ ๋ป์ ์ ํ ์๋์๋ค. ๋ ์คํจ์ ๊ณตํต ์์ธ์ ์ ํํ ์ง์ง ๋ชปํ๋ฉด(์ด๋ฒ์ "์ฝ๋ ๋ฐ์ดํธ ๋ณ๊ฒฝ"์ด ์ง์ง ๊ณตํต์ ์ด์๋ค), ์๋ฑํ ๊ฐ์ค(ํ์ด๋ฐ) ์ชฝ์ผ๋ก ๋ ์ธ์ ์ ํ๋นํ๊ฒ ๋๋ค. syscall๋ช ๋ น์ ์ง์ ์ฐ๋ ์ฝ๋๋ ์ฌ๋ณผ ๊ธฐ๋ฐ ํํน(LD_PRELOAD)์ด ํตํ์ง ์๋๋ค. libc ํจ์ ์ด๋ฆ์ ๊ฐ๋ก์ฑ๋ ๋ฐฉ์ด ์ฐํ๋ ์ ์ด์ "๊ทธ ์ด๋ฆ์ ํจ์๊ฐ ํธ์ถ๋๋ค"๋ ์ ์ ์์ ์ ์๋ค.0f 05(syscall) ๋ช ๋ น์ด ์ฝ๋์ ์ธ๋ผ์ธ์ผ๋ก ๋ฐํ ์์ผ๋ฉด ๊ทธ ์ ์ ์์ฒด๊ฐ ๊นจ์ง๋ค โ ๋์ptrace/gdb catch syscall์ฒ๋ผ ์ปค๋์ด syscall ์ง์ /ํ์ถ์ ์ธ์ํ๋ ์ง์ ์์ ๊ฐ์ ํด์ผ ํ๋ค.- ์ ์ ๋ฐฉ์ด(์ฝ๋ ๋ฌด๊ฒฐ์ฑ)์ ๋์ ๋ฐฉํด(์คํ ์๋)๋ ์๋ก ๋ค๋ฅธ ํ๋ฉด์ด๊ณ , ์ฐํ ์๋จ๋ ๋ฌ๋ผ์ผ ํ๋ค. ์ฝ๋ ๋ฌด๊ฒฐ์ฑ์ "๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฐ๊พธ๋ฉด" ํต๊ณผํ๊ณ , ์คํ ์๋๋ "syscall์ ์ธ์๊ฐ์ ๋ฐ๊พธ๋ฉด" ์ฐํ๋๋ค. ์ด ๋์ ๋ถ๋ฆฌํด์ ๋ณด์ง ๋ชปํ๋ฉด, ์ฝ๋๋ฅผ ๊ฑด๋๋ฆฌ๋ ์ฐํ(ํ์ผ ํจ์น, ์ํํธ ๋ธ๋ ์ดํฌํฌ์ธํธ)๋ก ์คํ ์๋ ๋ฌธ์ ๊น์ง ํด๊ฒฐํ๋ ค๋ค๊ฐ ์ ์ ๋ ์๋ฏผํ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฌ์ ๋จผ์ ๊ฑธ๋ฆฐ๋ค.
- ptrace ๊ธฐ๋ฐ ๋๊ตฌ๋ฅผ ์ง์ ๋ค๋ฃฐ ๋๋ syscall-enter์
$rax๊ฐ-ENOSYSํ๋ ์ด์คํ๋๋ผ๋ ์ฌ์ค์ ๋ฐ๋์ ๊ธฐ์ตํด์ผ ํ๋ค. ์ง์ง syscall ๋ฒํธ๋$orig_rax์ ์๋ค. ์ด ๊ตฌ๋ถ์ ๋์น๋ฉด "catch๋ ๋๋๋ฐ ์๋ฌด ๋ก์ง๋ ์ ๊ฑธ๋ฆฐ๋ค"๋, ์์ธ์ ์ง์ํ๊ธฐ ์ด๋ ค์ด ์กฐ์ฉํ ์คํจ๋ก ์ด์ด์ง๋ค โ ์ง๋๋ฒ์ "๊ด์ฐฐ์ด ๋ถ์์ ํ๋ค"๊ณ ์ ์๋ ๋ฐ๋ก ๊ทธ ์ฆ์์ด์๋ค.
๋ฐฉ์ด์ ๊ด์ ์์ ๋ณด๋ฉด, ์ฝ๋ ์์ฒด ํด์ ๊ฒ์ฆ(์์ฑ์์์ ์คํ๋๋ self-integrity check)์ ์ ์ ํจ์น์ ๋ํด ์๋นํ ํจ๊ณผ์ ์ธ ๋ฐฉ์ด์๋ค. ๋ฐ๋ฉด "syscall์ ์์ถ ํจ์ ์์ ๋ผ์ ์คํ์ ๋ฆ์ถ๋ค"๋ ์์ด๋์ด๋, syscall ์ธ์๋ฅผ ์กฐ์ํ๋ ๋์ ๊ฐ์ ์์์๋ ์ฌ์ค์ ๋ฌด๋ ฅํ๋ค โ ์ฝ๋๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๋ ๊ทธ ์ฝ๋๊ฐ ๋ง๋ค์ด๋ด๋ "ํจ๊ณผ"๋ง ๋ฌด๋ ฅํํ ์ ์๋ ์ง์ ์ด ์กด์ฌํ๋ค๋ฉด, ๋ฐฉ์ด๋ ๊ทธ ์ง์ ๊น์ง ๊ณ ๋ คํด์ ์ค๊ณ๋ผ์ผ ํ๋ค๋ ๊ฑธ ์ด ๋ฌธ์ ๊ฐ ์ ๋ณด์ฌ์ค๋ค.
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ