Codegate CTF 2018 Qual - BaskinRobins31
0x00. Introduction
)
Concept
๋ฒ ์คํจ๋ผ๋น์ค ๊ฒ์์ ๊ฑฐ๊พธ๋กํด์ 1~3๊น์ง์ ์ซ์๋ฅผ ๊ณ ๋ฅด๋ฉด (์ค์) 31์์ ๋นผ๊ณ , ๋ง์ง๋ง ์ซ์ 0์ ๋ถ๋ฅด๋ ์ฌ๋์ด ์ง๋ ๊ฒ์์ ๊ตฌํํ๋ค.
0x01. Vulnerability
__int64 __fastcall
์ทจ์ฝ์ ์ ๋จ์ํ๊ฒ ๋ด๊ฐ ์
๋ ฅ์ ๋ฃ๋ your_turn()์์ BOF๊ฐ ๋ฐ์ํ๋ค.
0x02. Exploit
= b + b * 0xaf
+= b * 8 # sfp
+=
+=
+=
+=
+=
+=
= -
= +
BOF๊ฐ ๊ฐ๋ฅํ๋ ROP๋ฅผ ์ด์ฉํด์ libc leak์ ํ๊ณ execve ์ฃผ์๊น์ง๋ ์ ํ๋ํ๋ค. ์ฒ์์๋ system์ ์ฃผ์๋ก exploit์ ์งํํ๋๋ฐ, stack alignment ๋๋ฌธ์ธ์ง segmentation fault๊ฐ ๋ฐ์ํด์ execve๋ก ๋ฐ๊ฟจ๋๋ ์ฑ๊ณตํ๋ค.
๋ฌธ์ ๋ execve์ ์ด๋ป๊ฒ /bin/sh๋ฅผ ์ ๋ฌํ๋๋์ธ๋ฐ, libc์์ ์ฐพ์์ ์ ๋ฌํด๋ ๋์ง๋ง environ์ ์ด์ฉํ stack leak์ผ๋ก ํด๊ฒฐํ๋ค.
= b + b * 0xaf
+= b * 8
+=
+=
+=
+=
+=
+=
=
์ด๋ ๊ฒ environ์ ๋ด๊ฒจ์๋ stack ์์ญ ์ฃผ์๋ฅผ ๋ฐ์์์ buf+0x8๊ณผ์ offset ์ฐจ์ด๋ฅผ ๊ณ์ฐํ ํ, buf+0x8์ /bin/sh ๋ฌธ์์ด์ ๋ฃ์ด์ execve ํจ์์ ์ธ์๋ก ์ ๋ฌํ๋ค.
= b + b * 7
+= b # buf + 0x8
+= b *
+= b * 8
+=
+= b * 0x18
+=
+=
+=
+=
+=
๊ทธ๋ฐ๋ฐ ๋ง์ง๋ง payload์์ pppr ๊ฐ์ ฏ์ ๊ฐ๋ ์ด์ํ๊ฒ rsi ๊ฐ๋ง ์ด์ํด์ ธ์ ์์ด ์๊พธ ์๋ด๋ค.
์ฒ์์๋ ๋ญ์ง ์ถ์ด์ ๊ทธ๋ฅ pppr ๊ฐ์ ฏ์ ๋ ๋ฒ ํธ์ถํ๋ ๊ฒ์ผ๋ก ํด๊ฒฐํ๋๋ฐโฆ
.text:000000000040095D mov rax, [rbp+var_B8]
.text:0000000000400964 mov eax, [rax]
.text:0000000000400966 sub eax, [rbp+choice]
์๊ณ ๋ณด๋ ๋ฒ ์คํจ๋ผ๋น์ค ๊ฒ์์ ํ๋ฉด์ ๋ด๊ฐ ์ ๋ ฅํ ๊ฐ์ด ๊ฐ์ํ๋ ๊ฒ์ด์๋ค ใ ใ ใ ใ
๊ทธ๋์ ์ด? ์์์๋ ์ ์ ๋์ง? ํ๊ณ ํ์ธํด๋ณด๋โฆ
;
;
์์ ROP payload์์๋ write์ size ์ธ์๊ฐ์์ 1, 2๋งํผ ๋น ์ก๊ณ , ์ฃผ์๊ฐ์ด ์ด์ฐจํผ 8๋ฐ์ดํธ๋ฅผ ๋ค ์์ฐ๋๊น ๊ด์ฐฎ์๋๊ฑฐ์๋ค ใ
ใ
ใ
ใ
Payload๋ฅผ ์์ฑํ ๋ dummy๋ฅผ ๋ค๋ฅด๊ฒ ๊ตฌ์ฑํด์ ์ด๋ payload๊ฐ ์ ๋ฌ๋๊ฑด์ง ์ ์ ์๊ฒ๋ ํ๋ ค๊ณ ํ๊ฑด๋ฐ, ์ด๋ฐ ๋๋นํจ๊ณผ๊ฐ ๋ฐ์ํ ์ค์ด์ผโฆ
0x03. Payload
= True
=
=
=
= f
=
=
=
=
=
= b + b * 0xaf
+= b * 8 # sfp
+=
+=
+=
+=
+=
+=
= -
= +
= b + b * 0xaf
+= b * 8
+=
+=
+=
+=
+=
+=
=
= b + b * 7
+= b
+= b *
+= b * 8
+=
+= b * 0x18
+=
+=
+=
+=
+=