Study/study

TLS, TLS ์ฝœ๋ฐฑํ•จ์ˆ˜

์œค์ •_ 2024. 5. 9. 13:23

TLS, Thread Local Storage

  • ์Šค๋ ˆ๋“œ: ํ”„๋กœ์„ธ์Šค ๋‚ด ์‹คํ–‰ ์˜ˆ์•ฝ ๋‹ด๋‹น ์—”ํ„ฐํ‹ฐ
    ํ”„๋กœ์„ธ์Šค์˜ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋Š” ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„, ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•˜๋Š”๋ฐ TLS๊ฐ€ ์ด๋ฅผ ๋‹ด๋‹น(๊ด€๋ฆฌ)
  • ๊ฐ ์Šค๋ ˆ๋“œ์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ /์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ณต๊ฐ„
    • ์Šค๋ ˆ๋“œ๋ณ„ ๋…๋ฆฝ๋œ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ณต๊ฐ„
  • TLS๋ฅผ ํ†ตํ•ด ํ”„๋กœ์„ธ์Šค์˜ ์ „์—ญ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์Šค๋ ˆ๋“œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณต
  • ํ•œ ์Šค๋ ˆ๋“œ์—์„œ ์ธ๋ฑ์Šค๋ฅผ ํ• ๋‹น์„ ๋‹ด๋‹น
  • TLS ๋™์ž‘ ๋ฐฉ์‹
    • TLS์™€ ์Šค๋ ˆ๋“œ๋ณ„ ์ธ๋ฑ์Šค(gdwTlsIndex)๋ฅผ ํ• ๋‹น 
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก(Data)์„ ํ• ๋‹นํ•˜๊ณ  TLS ์Šฌ๋กฏ์— ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ ์ €์žฅ
    • TLS ์Šฌ๋กฏ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ด๋ฅผ ์ง€์—ญ ๋ณ€์ˆ˜ lpvData์— ์ €์žฅ

How TLS works

 

 

 

TLS ์ฝœ๋ฐฑํ•จ์ˆ˜

  • ํ”„๋กœ์„ธ์Šค์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ/์ข…๋ฃŒ๋  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜
  • ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋‚˜๊ฐ€ ์ƒ์„ฑ๋˜์ง€๋งŒ ์—ฌ๋Ÿฌ ๊ฐœ๋„ ๊ฐ€๋Šฅ
  • TLS ๋ฐ์ดํ„ฐ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ดˆ๊ธฐํ™” ๋ฐ ์ข…๋ฃŒ๋ฅผ ์ง€์›
    • ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ƒ์„ฑ์ž์™€ ์†Œ๋ฉธ์ž(constructors and destructors) ํ˜ธ์ถœ
  • ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ์—๋„ ํ˜ธ์ถœ
    EP ์ฝ”๋“œ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰
  • ์•ˆํ‹ฐ ๋””๋ฒ„๊น… ๊ธฐ๋ฒ•์œผ๋กœ ํ™œ์šฉ๋˜๊ธฐ๋„ ํ•จ
  • TLS ์ฝœ๋ฐฑํ•จ์ˆ˜ ํ˜•์‹ 
    • DllHandle: TLS ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” DLL์˜ ํ•ธ๋“ค
    • Reason: TLS ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ์ด์œ 
      • DLL_PROCESS_ATTACH(1): ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ main ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ „ ๋“ฑ๋ก๋œ TLS ์ฝœ๋ฐฑํ•จ์ˆ˜๋“ค์„ ํ˜ธ์ถœ
      • DLL_THREAD_ATTACH(2): TLS ์ฝœ๋ฐฑํ•จ์ˆ˜๋“ค์ด ๋ชจ๋‘ ์ข…๋ฃŒ๋˜๋ฉด main ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์‚ฌ์šฉ์ž ์Šค๋ ˆ๋“œ(ThreadProc)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ˆœ๊ฐ„ TLS ์ฝœ๋ฐฑํ•จ์ˆ˜๋“ค์ด ํ˜ธ์ถœ๋จ
      • DLL_THREAD_DETACH(3): TLS ์ฝœ๋ฐฑํ•จ์ˆ˜๋“ค์ด ๋ชจ๋‘ ์ข…๋ฃŒ๋˜๋ฉด ThreadProc ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ , ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ์ˆœ๊ฐ„ TLS ์ฝœ๋ฐฑํ•จ์ˆ˜๋“ค์ด ํ˜ธ์ถœ๋จ
      • DLL_PROCESS_DETACH(0): ThreadProc() ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์Šค๋ ˆ๋“œ์˜ ์ข…๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋˜ main ํ•จ์ˆ˜(๋ฉ”์ธ ์Šค๋ ˆ๋“œ)๋„ ์ข…๋ฃŒ๋˜๊ณ , TLS ์ฝœ๋ฐฑํ•จ์ˆ˜๋“ค์ด ํ˜ธ์ถœ๋จ
    • Reserved: ์˜ˆ์•ฝ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜. 0์œผ๋กœ ์„ค์ •
typedef VOID
(NTAPI *PIMAGE_TLS_CALLBACK) (
    PVOID DllHandle,
    DWORD Reason,
    PVOID Reserved
    );

 

 

 

TLS ์ฝœ๋ฐฑํ•จ์ˆ˜ ์˜ˆ์ œ: HelloTls.exe (reversecore)

  • HelloTls.exe์€ ์‹คํ–‰ํ•˜๋ฉด Hello :) ๋ฉ”์‹œ์ง€ ๋ฐ•์Šค๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ

HelloTls.exe ์‹คํ–‰ ํ™”๋ฉด

 

  • ๋””๋ฒ„๊ฑฐ๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด Debugger Detected! ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅ

๋””๋ฒ„๊ฑฐ๋ฅผ ํ†ตํ•œ HelloTls.exe ์‹คํ–‰ ํ™”๋ฉด

 

  • ์•ˆํ‹ฐ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด IsDebuggerPresent ํ•จ์ˆ˜๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•˜์—ฌ ๋””๋ฒ„๊ฑฐ ์œ ๋ฌด๋ฅผ ํŒ๋‹จ
  • ๋””๋ฒ„๊ฑฐ๊ฐ€ ๊ฐ์ง€๋˜๋ฉด Debugger Detected! ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฉ”์‹œ์ง€ ๋ฐ•์Šค๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒ

Anti-Debugging code of HelloTls.exe

 

ใ€€ใ€€ใ€€⇒ TLS ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด entry point ์ฝ”๋“œ๋ณด๋‹ค ์•ˆํ‹ฐ ๋””๋ฒ„๊น… ์ฝ”๋“œ๊ฐ€ ๋จผ์ € ์‹คํ–‰

 

  • ํ”„๋กœ๊ทธ๋žจ์—์„œ TLS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด PE ํ—ค๋” Data Directory์— TLS Table์ด ์„ธํŒ…๋จ

TLS Table

 

  • TLS Directory ๊ตฌ์กฐ์ฒด
    • Address of Callbacks์— TLS ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ฃผ์†Œ๊ฐ€ ์žˆ์Œ (๋ฐฐ์—ด ํ˜•ํƒœ)

TLS Directory

 

  • Address of Callbacks(VA 408110)์— ์žˆ๋Š” TLS ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ์ฃผ์†Œ: 0x401000

Address (array) of TLS Callbacks
์‹ค์ œ TLS ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ์ฃผ์†Œ

 

 

 

 

 

 

 

 

 

Ref.

[1] Learn Microsoft, "Thread Local Storage"