DEFCON 31 LiveCTF - shop
0x00. Introduction
Structures
Goal
unsigned __int64
๋ก๊ทธ์ธ ์ดํ์ ๋ฉ๋ด์์ 7๋ฒ์ ์ ํํ๋ฉด ํธ์ถ๋๋ ์จ๊ฒจ์ง hidden_1C83()์ด ์กด์ฌํ๋ค. ์ฌ๊ธฐ์์ login_info์ ์ฒซ ๋ฐ์ดํธ, ์ฆ is_admin์ ๊ฐ์ด 0์ด ์๋๋ฉด ์์ ๋์์ค๋ค.
0x01. Vulnerability
unsigned __int64
unsigned __int64
add_item_1357()์์ item์ ์ถ๊ฐํ๋ฉด item_ptr์ ํ ์์ญ์ด ํ ๋น๋๋ค. ์ด๊ฒ์ remove_item_14B6()์์ item์ ์ญ์ ํ ๋ ์ฒญํฌ ์ฌ์ด์ฆ๋ง ์ค์ฌ์ ์ฌํ ๋นํ๋๋ฐ ์ฌ์ด์ฆ๊ฐ 0์ด ๋์ ๋ realloc()์์ NULL์ด ๋ฆฌํด๋๋ค.
๊ทธ๋ฐ๋ฐ shelf_ptr->item_ptr์ ๊ฐ์ด ์ด๊ธฐํ๋์ง ์๊ณ ๊ทธ๋๋ก ๋จ์์๊ณ , ์ญ์ ์ดํ ๋ค์ add_item_1357()์ ํธ์ถํ ๋ ํด์ ๋ ์์ญ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ UAF ์ทจ์ฝ์ ์ด ์กด์ฌํ๋ค.
0x02. Exploit
unsigned __int64
open_account_1932()๋ฅผ ๋ณด๋ฉด ๊ณ์ ์ ์์ฑํ๊ณ ๋ฐ๋ก is_admin์ 0์ผ๋ก ๋ง๋ ๋ค.
๋ฐ๋ผ์ A ๊ณ์ ์ ๋ง๋ค๊ณ item์ ์ถ๊ฐ ํ ์ญ์ ํ์ฌ ํด์ ๋ ์์ญ์ B ๊ณ์ ์ credential ๊ตฌ์กฐ์ฒด๊ฐ ๊ฐ๋ฆฌํค๋๋ก exploit์ ๊ตฌ์ฑํ๋ค.
- open_account A
- add_item 1
- remove_item 0
- logout
- open_account B
์ด๋ฌํ ์์๋ก ํ์ด๋ก๋๋ฅผ ์์ฑํด์, A์ item_ptr๊ณผ B์ credential์ด ๊ฐ์ ์์ญ์ ์์นํ๊ฒ ๋ง๋ค ์ ์๊ณ ,
- login as A
- add_item 2
๋ค์ A๋ก ๋ก๊ทธ์ธํ ํ์ item์ ์ถ๊ฐํด์ item->number๋ฅผ ๋ณต์ฌํ๋ ๊ณผ์ ์์ is_admin์ด ๋ฎ์ด๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํ์ผ๋โฆ
# Credential of B - BEFORE
# Credential of B - AFTER
์์ด ๋จ์ด์ ธ์ ์ค์ ๊ฐ์ด ์ ๋ฎ์๋์ง ํ์ธํด๋ณด๋ item->number๊ฐ ์๋ ํด์ ๋ chunk์ ๋ฉํ ๋ฐ์ดํฐ๋ก ๋ฎ์ฌ์์๋ค.
๊ณฐ๊ณฐ์ด ์๊ฐํด๋ณด๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์๋ค.
remove_item_14B6()์์realloc()์ดNULL์ ๋ฆฌํดํด์item_ptr์ด๊ธฐํ๋ ๋ฌผ๋กcount๊ฐ๋ ์์์ง์ง ์์- ๋ค์
add_item_1357()๋ฅผ ํ๋ ๊ณผ์ ์์count๊ฐ์ด ์์ง 1์ด๋ฏ๋ก 0x40๋งํผrealloc()์ ์์ฒญํจ - ์ฌ์ด์ฆ๋ ๋ง์ง ์๊ฑฐ๋์ B์
credential์ด ์๋ ์์ญ์ ๋ค์free๋ ์ ๋ ์๊ธฐ ๋๋ฌธ์ ์์ ๋ค๋ฅธ ์์ญ์ด ํ ๋น๋จ
๊ฒฐ๊ณผ์ ์ผ๋ก๋ realloc ๊ณผ์ ์์ ๋ฉํ ๋ฐ์ดํฐ๊ฐ ์ฐ์ฌ์ง๋ฉด์ is_admin์ด ๋ฎ์ด๊ฒ ๋์ด ๋คํํ exploit์ด ์ฑ๊ณตํ๋ค. ์ด์ฉ๋ค ๋ณด๋ unintended solution์ผ๋ก ํผ ๊ฒ ๊ฐ๋คโฆ ใ
ใ
ใ
ใ
0x03. Payload
=
=
= 0x0000555555554000
=
= f
=
=
return
=
=
=
=
# open_account of A
# add_item 1
# remove_item 0
# logout
# open_account of B
# logout
# login as A
# add_item 2
# logout
# login as B
# hidden