TLS, Thread Local Storage
- ์ค๋ ๋: ํ๋ก์ธ์ค ๋ด ์คํ ์์ฝ ๋ด๋น ์ํฐํฐ
ํ๋ก์ธ์ค์ ๋ชจ๋ ์ค๋ ๋๋ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ, ์์คํ ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ๋๋ฐ TLS๊ฐ ์ด๋ฅผ ๋ด๋น(๊ด๋ฆฌ) - ๊ฐ ์ค๋ ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ /์ ๊ณตํ๊ธฐ ์ํ ๊ณต๊ฐ
- ์ค๋ ๋๋ณ ๋ ๋ฆฝ๋ ๋ฐ์ดํฐ ์ ์ฅ ๊ณต๊ฐ
- TLS๋ฅผ ํตํด ํ๋ก์ธ์ค์ ์ ์ญ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์ค๋ ๋์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณต
- ํ ์ค๋ ๋์์ ์ธ๋ฑ์ค๋ฅผ ํ ๋น์ ๋ด๋น
- TLS ๋์ ๋ฐฉ์
- TLS์ ์ค๋ ๋๋ณ ์ธ๋ฑ์ค(gdwTlsIndex)๋ฅผ ํ ๋น
- ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก(Data)์ ํ ๋นํ๊ณ TLS ์ฌ๋กฏ์ ํด๋น ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๋ํ ํฌ์ธํฐ ์ ์ฅ
- TLS ์ฌ๋กฏ์์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๋ํ ํฌ์ธํฐ๋ฅผ ๊ฒ์ํ๊ณ ์ด๋ฅผ ์ง์ญ ๋ณ์ lpvData์ ์ ์ฅ
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 :) ๋ฉ์์ง ๋ฐ์ค๋ฅผ ์ถ๋ ฅํ๋ ๊ฐ๋จํ ํ๋ก๊ทธ๋จ
- ๋๋ฒ๊ฑฐ๋ฅผ ํตํด ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด Debugger Detected! ๋ฌธ์์ด์ ์ถ๋ ฅ
- ์ํฐ ๋๋ฒ๊น ์ ์ํด IsDebuggerPresent ํจ์๋ฅผ ๋จผ์ ์คํํ์ฌ ๋๋ฒ๊ฑฐ ์ ๋ฌด๋ฅผ ํ๋จ
- ๋๋ฒ๊ฑฐ๊ฐ ๊ฐ์ง๋๋ฉด Debugger Detected! ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ ๋ฉ์์ง ๋ฐ์ค๋ฅผ ์ถ๋ ฅํ๊ณ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃ
ใใใ⇒ TLS ์ฝ๋ฐฑํจ์๋ฅผ ํตํด entry point ์ฝ๋๋ณด๋ค ์ํฐ ๋๋ฒ๊น ์ฝ๋๊ฐ ๋จผ์ ์คํ
- ํ๋ก๊ทธ๋จ์์ TLS๋ฅผ ์ฌ์ฉํ๋ฉด PE ํค๋ Data Directory์ TLS Table์ด ์ธํ ๋จ
- TLS Directory ๊ตฌ์กฐ์ฒด
- Address of Callbacks์ TLS ์ฝ๋ฐฑํจ์ ์ฃผ์๊ฐ ์์ (๋ฐฐ์ด ํํ)
- Address of Callbacks(VA 408110)์ ์๋ TLS ์ฝ๋ฐฑํจ์์ ์ฃผ์: 0x401000
Ref.
[1] Learn Microsoft, "Thread Local Storage"
'Study > study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋งํฌ ๋ฐฉ์์ ๋ฐ๋ฅธ ๋์ค์ด์ ๋ธ๋ฆฌ ์ฝ๋ ํน์ง (1) | 2024.11.07 |
---|---|
์๋ ์คํ ๋ฑ๋ก ํ๋ก๊ทธ๋จ(C++) ๋ฆฌ๋ฒ์ฑ (0) | 2024.11.05 |
SEH, TEB(TIB), PEB์ FS ๋ ์ง์คํฐ๋ฅผ ํตํด ์ ๊ทผํ๋ ๋ฐฉ๋ฒ (0) | 2024.05.14 |
SEH, ์์ธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ (0) | 2024.05.13 |
SEH, ๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ (2) | 2024.05.07 |