๋ผ์ด๋ธ๋ฌ๋ฆฌ ๐
์ฌ๋ฌ ์ปดํ์ผ ์ธ์ด๋ค์ ์์ฃผ ์ฌ์ฉ๋๋ ํจ์๋ค์ ์ ์๋ฅผ ๋ฌถ์ด์ ํ๋์ lib ํ์ผ๋ก ์์ฑ
์ด๋ฅผ ์ฌ๋ฌ ํ๋ก๊ทธ๋จ์ด ๊ณต์ ํด์ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ ํจ์๋ค ๋ฐ๋ณต์ ์ ์ ํ์ X
์ฆ, ์ฝ๋ ๊ฐ๋ฐ์ ํจ์จ์ฑ์ด ํฅ์๋๋ ์ฅ์ !!
๋ํ ๊ฐ ์ธ์ด์ ๋ฒ์ฉ์ ์ฌ์ฉ๋๋ ํจ์๋ค์ ํ์ค lib๊ฐ ์ ์๋์ด ๊ฐ๋ฐ์๋ค์ด ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ์ฃ
๋ํ์ ์ธ C์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ libc๋ ์ฐ๋ถํฌ์ ๊ธฐ๋ณธ ํ์ฌ๋ lib์
๋๋ค.
์ค์ตํ๊ฒฝ์์ /lib/x86_64-linux-gun/libc-2.27.so ๊ฐ ์์ฃ
๊ทธ๋ฆฌ๊ณ ๊ธฐํ ํจ์๋ค์ ์ฌ์ฉ์ ์์ด์ ์ ์ ์์ด ์ฌ์ฉํ ์ ์๋ ์ด์ ๋ ์ด ์ด์ ๋๋ฌธ์ ๋๋ค.
๋งํฌ๐๏ธ
๋งํฌ(Link)๋ ๋ง์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ปดํ์ผ์ ๋ง์ง๋ง ๋จ๊ณ๋ก์จ..
ํ๋ก๊ทธ๋จ์์ ์ด๋ค lib์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด, ํธ์ถ๋ ํจ์์ ์ค์ libํจ์๊ฐ ๋งํฌ ๊ณผ์ ์ ์ฐ๊ฒฐ๋จ
๋ฆฌ๋
์ค์์ C ์์ค ์ฝ๋๋ ์ ์ฒ๋ฆฌ, ์ปดํ์ผ, ์ด์
๋ธ ๊ณผ์ ์ ๊ฑฐ์ณ ELF ํ์์..
๊ฐ์ถ ์ค๋ธ์ ํธ ํ์ผ(Object file)๋ก ๋ฒ์ญ๋๋ฉฐ ์์ ๋ช
๋ น์ด๋ก hello-world.c๋ก ์ด์
๋ธ๋ฉ๋๋ค.
์๋ก์ ๊ฐ์ ๋ช
๋ น์ด๋ก ์ด์
๋ธ ํ ์ ์์ต๋๋ค.
์ค๋ธ์ ํธ ํ์ผ์ ์คํ ๊ฐ๋ฅํ ํ์์ ๊ฐ์ถ๊ณ ์์ง๋ง, lib ํจ์๋ค์ ์ ์์ ์์น๋ฅผ ๋ชจ๋ฅด๊ธฐ์ ์คํ X
๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํด๋ณด๋ฉด, puts์ ์ ์ธ์ด stdio.h์ ์์ด์ ์ฌ๋ณผ(Symbol;)๋ก ๊ธฐ๋ก๋๋ ๊ทธ์ ๋ํ ๋ด์ฉ์..
์ฌ๋ณผ๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ค์ ์ฐพ์์ ์ต์ข
์คํ ํ์ผ์ ๊ธฐ๋กํ๋ ๊ฒ์ด ๋งํฌ ๊ณผ์ ์์ ํ๋ ์ผ ์ค ํ๋์
๋๋ค.
์ฐธ๊ณ ๋ก ๋ฐ์ ์ฝ๋๋ค์ ์์ ์คํํ ๊ฒ๋ค ํ์ธ ์ฉ๋ ์ฝ๋์
๋๋ค.
ํ๋ฒ์ฏค ํ์
๋ ์ข๊ณ , ์ํด๋ ์ข๊ณ ..
123456789 // Name: hello-world.c// Compile: gcc -o hello-world hello-world.c#include <stdio.h>int main() {puts("Hello, world!");return 0;}cs
์ด์ ์์ ๋ฅผ ์์ ํ ์ปดํ์ผํ๊ณ ๋ค์ ๋ช
๋ น์ด๋ฅผ ํตํด ๋งํฌ ์ ํ๋ฅผ ๋น๊ตํด๋ด
์๋ค.
์์ ์ด๋ฏธ์ง๋ค์ด ์ด๋ฏธ libc์์ puts์ ์ ์๋ฅผ ์ฐพ์ ์ฐ๊ฒฐํ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ libc๋ฅผ ๊ฐ์ด ์ปดํ์ผํ์ง ์์์์๋ libc์์ ํด๋น ์ฌ๋ณผ์ ํ์ํ ๊ฒ์,
libc๊ฐ ์๋ /lib/x86_64-linux-gun/๊ฐ ํ์ค lib ๊ฒฝ๋ก์ ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค.
gcc๋ ์์ค ์ฝ๋๋ฅผ ์ปดํ์ผํ ๋ ํ์ค lib์ lib ํ์ผ๋ค์
๋ชจ๋ ํ์ ๋ฐ์ ๋ช
๋ น์ด๋ก ํ์ค lib ๊ฒฝ๋ก ํ์ธ ๊ฐ๋ฅ
๋งํฌ๋ฅผ ๊ฑฐ์น๊ณ ๋๋ฉด ํ๋ก๊ทธ๋จ์์ puts๋ฅผ ํธ์ถํ ๋, puts์ ์ ์๊ฐ ์๋ libc์์
puts์ ์ฝ๋๋ฅผ ์ฐพ๊ณ ํด๋น ์ฝ๋๋ฅผ ์คํํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ๋ช
๋ น์ด๋ค์ ๋ํ์ฌ ์ต์ํ์ง ์๋๋ค๋ฉด.. ๊ตฌ๊ธ๋งํด์ ๊ณต๋ถํด์ผ๊ฒ ์ฃ ..
์ ๋ ๋งํ๊ฑฐ๋ ๋ชจ๋ฅผ๋ ๊ทธ๋๋ง๋ค ํด๋ด์ ใ
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋งํฌ์ ์ข ๋ฅ
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํฌ๊ฒ ๋์ /์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ตฌ๋ถ๋จ
- ๋์ ๋งํฌ(Dynamic Link) : ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋งํฌํ ๊ฒ
- ์ ์ ๋งํฌ(Static Link) : ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋งํฌํ ๊ฒ
๋์ ๋งํฌ
๋์ ๋งํฌ๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์คํํ๋ฉด ๋์ lib๊ฐ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ์ ๋งคํ๋จ!
๊ทธ๋ฆฌ๊ณ ์คํ ์ค์ lib ํจ์๋ฅผ ํธ์ถ ์ ๋งคํ๋ lib์ ํธ์ถํ ํจ์ ์ฃผ์๋ฅผ ์ฐพ์ ๊ทธ ํจ์๋ฅผ ์คํ!
๋ง์น ์ด ๊ณผ์ ์ ์ฌ๋์ด ๋์๊ด์ ๋ฐฉ๋ฌธ์ ์ํ๋ ์ฑ
์์น ์ฐพ๊ณ
๊ทธ ์ฑ
์์ ์ ๋ณด ์ต๋ํ๋ ๊ณผ์ ๊ณผ ์ ์ฌํจ
์ ์ ๋งํฌ
๋๊ฐ์ด ๋น์ ํ๋ฉด ์ด ๊ฒ์ ๋์๊ด์ ๋ชจ๋ ์ฑ
์ ์๊ธฐํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
์ ์ ๋งํฌ๋ฅผ ํ๋ฉด ๋ฐ์ด๋๋ฆฌ์ ์ ์ lib์ ๋ชจ๋ ํจ์๊ฐ ํฌํจ๋ฉ๋๋ค.
์ฆ, ํด๋น ํจ์ ํธ์ถ ์, lib์ ์ฐธ์กฐ๊ฐ ์๋ ์์ ์ ํจ์ ํธ์ถํ๋ฏ ํ๋ค๋ ์ด์ผ๊ธฐ!!
lib์์ ์ํ๋ ํจ์๋ฅผ ์ฐพ์ ํ์ ์์ด ํ์ ๋น์ฉ์ด ์ ๊ฐ๋๋ ๋ฏํ์ง๋ง,
์ฌ๋ฌ ๋ฐ์ด๋๋ฆฌ์์ lib๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ lib์ ๋ณต์ ๊ฐ ์ฌ๋ฌ ๋ฒ ์ด๋ฃจ์ด์ง๊ธฐ์ ์ฉ๋ ๋ญ๋น๋ ๋๊ฒ ์ฃ
๊ทธ๋ผ ์ด ๋์ ์ฐจ์ด์ ์ ์์๋ณด๊ธฐ ์ํด hello-world.c๋ฅผ ํตํด ๊ฐ๋จํ๊ฒ ์์๋ด ์๋ค!
๋์ ๋งํฌ vs ์ ์ ๋งํฌ
๋จผ์ ์์ hello-world.c๋ฅผ ์ ์ ์ปดํ์ผํ์ฌ static์, ๋์ ์ผ๋ก dynamic์ ์์ฑํฉ์๋ค
์ฉ๋
๊ฐ ์ฉ๋์ ๋น๊ตํ๋ฉด static์ด dynamic๋ณด๋ค 100๋ฐฐ ๊ฐ๊น์ด ๋ ํฐ ์ฉ๋์ ์ฐจ์งํ๋ต๋๋ค.
ํธ์ถ ๋ฐฉ๋ฒ
static์์ puts๊ฐ ์๋ 0x40a770์ ์ง์ ํธ์ถํ๋ฉฐ ๋ฐ๋ฉด dynamic์ 0x401030(plt)์ ํธ์ถํ์ฃ
์ด๋ฐ ์ฐจ์ด๊ฐ ์๋ ์ด์ ๋ ์์์ ๋ง์ด ์ค๋ช
ํ๊ณ , plt๋ dynamic์ ๊ณผ์ ์์ ์ฌ์ฉ๋๋ ํ
์ด๋ธ์
๋๋ค
PLT์ GOT
PLT(Procedure Linkage Table)
GOT(Global Offset Table)
์ด ๋์ lib์์ ๋์ ๋งํฌ๋ ์ฌ๋ณผ ์ฃผ์ ์ฐพ์ ๋ ์ฌ์ฉ๋๋ ํ ์ด๋ธ์ ๋๋ค.
๋ฐ์ด๋๋ฆฌ๊ฐ ์คํ๋๋ฉด ASLR์ ์ํด lib๊ฐ ์์์ ์ฃผ์์ ๋งคํ๋ฉ๋๋ค.
์ด ์ํ์์ lib ํจ์๋ฅผ ํธ์ถ → ํจ์ ์ด๋ฆ์ ๋ฐํ lib์ ์ฌ๋ณผ๋ค ํ์ → ํจ์ ์ ์ ๋ฐ๊ฒฌ ๊ทธ ์ฃผ์๋ก ์คํ ํ๋ฆ
์ด ์ ๊ณผ์ ์ ํตํ์ด runtime resolve๋ผ๊ณ ํ๋๋ฐ, ์ด๋ ๋์ค์ ์์ธํ.. ๋ณด์๊ณ ์
๊ทธ๋ฐ๋ฐ ๋ง์ฝ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถ๋๋ ํจ์์ ์ ์๋ฅผ ๋งค๋ฒ ํ์ํ๋ค๋ฉด ๋นํจ์จ์ ์ด๊ฒ ์ฃ
๊ทธ๋์ ELF๋ GOT๋ผ๋ ํ
์ด๋ธ์ ๋๊ณ , resolve๋ ํจ์์ ์ฃผ์๋ฅผ ํด๋น ํ
์ด๋ธ์ ์ ์ฅํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋์ค์ ๋ค์ ํด๋น ํจ์๋ฅผ ํธ์ถ ์ ์ ์ฅ๋ ์ฃผ์๋ฅผ ๊บผ๋ด ์ฌ์ฉํ์ฃ
๊ทธ๋ผ ์์ ์ฝ๋๋ฅผ ์ด์ฉํด ์ค์ ๋ฐ์ด๋๋ฆฌ์์ ์ด๋ป๊ฒ ์ด๋ฐ ๋์์ด ์ผ์ด๋๋์ง ์ดํด๋ด ์๋ค!
12345678910 // Name: got.c// Compile: gcc -o got got.c#include <stdio.h>int main() {puts("Resolving address of 'puts'.");puts("Get address from GOT");}cs
resolve๋๊ธฐ ์
๋จผ์ got.c๋ฅผ ์ปดํ์ผํ๊ณ , ์คํ ํ GOT๋ฅผ ํ์ธํด๋ณด๋ฉด ์์ง puts์ ์ฃผ์๋ฅผ ์ฐพ๊ธฐ ์ ์ด๋ฏ๋ก
ํจ์์ ์ฃผ์๊ฐ ์๋ puts@plt+6๋ผ๋ PLT ๋ด๋ถ์ ์ฃผ์๊ฐ ์ ํ์์ฃ
gdb ./got → start → got
์ด์ puts@plt๋ฅผ ํธ์ถํ๋ ์ง์ ์ ์ค๋จ์ ์ ์ค์ ํ๊ณ , ๋ด๋ถ๋ก ๋ฐ๋ผ๊ฐ ๋ณด๊ฒ ์ต๋๋ค.
PLT์์๋ ๋จผ์ puts์ GOT์ธ 0x555...8018์ ์ฐ์ธ๊ฐ์ผ๋ก ์คํ ํ๋ฆ์ ์ฎ๊น๋๋ค.
ํ์ฌ GOT์๋ puts@plt+6์ ์ฃผ์๊ฐ ์ฐ์ฌ์์ผ๋ฏ๋ก, ๋ฐ๋ก ๋ค์ ์ค์ ์ฝ๋๋ฅผ ์คํ!
b *main+11 → c → si → ni
์ฌ๊ธฐ์ ์ฝ๋๋ฅผ ์กฐ๊ธ ๋ ์คํ์ํค๋ฉด dl_runtime_resolve_xsavec๋ผ๋ ํจ์๊ฐ ์คํ๋๋๋ฐ,
์ด ํจ์์์ puts์ ์ฃผ์๊ฐ ๊ตฌํด์ง๊ณ , GOT์ ์ฃผ์๊ฐ ์จ์ง๋๋ค.
ni.. → finish → got
resolve๋ ํ
๋ ๋ฒ์งธ๋ก puts@plt๋ฅผ ํธ์ถํ ๋๋ GOT์ puts์ ์ฃผ์๊ฐ ์ฐ์ฌ์์ด์ ๋ฐ๋ก puts๊ฐ ์คํ๋ฉ๋๋ค.
์์คํ ํดํน์ ๊ด์ ์์ ๋ณธ PLT์ GOT
PLT์ GOT๋ ๋์ ๋งํฌ๋ ๋ฐ์ด๋๋ฆฌ์์ lib ํจ์์ ์ฃผ์๋ฅผ ์ฐพ๊ณ , ๊ธฐ๋กํ ๋ ์ฌ์ฉ๋๋ ์ค์ ํ
์ด๋ธ!
๊ทธ๋ฐ๋ฐ, ํด์ปค ๊ด์ ์์ PLT → GOT๋ฅผ ์ฐธ์กฐํด ์คํ ํ๋ฆ์ ์ฎ๊ธธ ๋, GOT์ ๊ฐ ๊ฒ์ฆ X(๋ณด์ ์ทจ์ฝ)
๋ฐ๋ผ์ ์์ ์์์ GOT์ ์ ์ฅ๋ puts์ ์ฃผ์๋ฅผ ๊ณต๊ฒฉ์๊ฐ ์์๋ก ๋ณ๊ฒฝ ํ๋ฉด,
๋ ๋ฒ์งธ๋ก puts๊ฐ ํธ์ถ ์ ๊ณต๊ฒฉ์๊ฐ ์ํ๋ ์ฝ๋๊ฐ ์คํํ ์ ์์ต๋๋ค.
์ด ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ด ๊ฐ๋ฅํ์ง gdb๋ฅผ ์ด์ฉํด ๊ฐ๋จํ ์ค์ต์ ํด๋ด
์๋ค.
์์ got ๋ฐ์ด๋๋ฆฌ์ ๋ ๋ฒ์งธ puts ํธ์ถ ์ง์ ์ puts์ GOT ๊ฐ์..
"AAAAAAAA"๋ก ๋ณ๊ฒฝ ํ ์คํํ๋ฉด ์ค์ ๋ก ์
๋ ฅํ๋๋ก ์คํ ํ๋ฆ์ด ์ฎ๊ฒจ์ง๋ต๋๋ค.
gdb ./got → b* main+29 → r
→ set *(unsigned long long*)0x555555558018 = 0x4141414141414141 → c
๋ญ ๋น์ฐํ๊ฑฐ๊ฒ ์ง๋ง ์ง์ ํด๋ณด์๋ฉด ํ๊ฒฝ๋ง๋ค ๋ค๋ฅด๋๊น ๋ง๋ฅ ๋ฐ๋ผ๋ง ํ์ง ๋ง๊ณ ์์๋ด์ผ๊ฒ ์ฃ ?
์ด๋ฐ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ GOT Overwrite๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์์ ์ฃผ์์ ๊ฐ์ ์ธ ์ ์์ ๋,
RCE๋ฅผ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โSystem_Study > ๐โDreamhack_Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Exploit Tech: Return Oriented Programming (0) | 2022.07.05 |
---|---|
Exploit Tech: Return to Library (0) | 2022.06.13 |
Mitigation: NX & ASLR (0) | 2022.06.07 |
ssp_001 (0) | 2022.05.23 |
Exploit Tech: Return to Shellcode (0) | 2022.05.03 |