前兩天獲得廣大迴響,實在讓我嚇了一跳 = = 還被比喻為駭客列傳.....實在有點誇大了 (汗) ,台灣低調的強者有太多了,我只會介紹 HITCON CTF team 的成員而已 XD 今天要介紹的人物相對低調,但可說是目前 HITCON CTF team 的主要戰力
BTW,標題是台灣記者下標法 (逃),詳細由來請參考內文 XD
HITCON CTF team 跟忍者之里一樣,大致可以分為幾個時期,因為我們是個鬆散的組織 (?),不需要交什麼入會書或入黨宣誓,就以每年打 DEF CON CTF 為分界點來做分期
Orange
領軍成立 HITCON CTF teamangelboy
於此期加入隊伍 XDdavid942j
於此期加入隊伍,是這期 pwn 的最強戰力之一
meh
也是這期的成員 ... XDD這是 david942j 在 HITCON CMT 2017 投的 talk,算是第一次出現在眾人面前上,號稱該年度最中二的標題 XDD
execve
執行 /bin/sh、再調用外部系統指令的 assembly,當 explolit 已經得知 libc 的位之後而且可以控制 RIP 之後,就可以直接跳該位置達成 shell out,不需要再辛苦堆 stack 上的參數
NULL
時,就會被視為調用額外參數而沒辦法純粹執行 execve("/bin/sh", NULL, NULL)
execve
的調用已經是標配了......,逼大家只能做 ROP chain 或跑 shellcode T___T此議題在 HITCON CMT 2018 初登場,講述的是在 HITCON CTF 2017 出的一道題目 天衣無縫~Fantastic Seamless Textile~
背後使用的技術,在 2019 的台灣資安大會中也有再講過一次
turkey
, lyc
在 HITCON 合講的一場 talk,內容可以參考這份 投影片
除了上述兩個以外 talk 以外,david942j 也寫了不少 CTFer 常用的工具:
# line CODE JT JF K
# =================================
# 0000: 0x20 0x00 0x00 0x00000000 A = sys_number
# 0001: 0x15 0x00 0x01 0x00000002 if (A != open) goto 0003
# 0002: 0x06 0x00 0x00 0x00000000 return KILL
# 0003: 0x15 0x00 0x01 0x00000101 if (A != openat) goto 0005
# 0004: 0x06 0x00 0x00 0x00000000 return KILL
# 0005: 0x15 0x00 0x01 0x0000003b if (A != execve) goto 0007
# 0006: 0x06 0x00 0x00 0x00000000 return KILL
# 0007: 0x15 0x00 0x01 0x00000038 if (A != clone) goto 0009
# 0008: 0x06 0x00 0x00 0x00000000 return KILL
# 0009: 0x15 0x00 0x01 0x00000039 if (A != fork) goto 0011
# 0010: 0x06 0x00 0x00 0x00000000 return KILL
# 0011: 0x15 0x00 0x01 0x0000003a if (A != vfork) goto 0013
# 0012: 0x06 0x00 0x00 0x00000000 return KILL
# 0013: 0x15 0x00 0x01 0x00000055 if (A != creat) goto 0015
# 0014: 0x06 0x00 0x00 0x00000000 return KILL
# 0015: 0x15 0x00 0x01 0x00000142 if (A != execveat) goto 0017
# 0016: 0x06 0x00 0x00 0x00000000 return KILL
# 0017: 0x06 0x00 0x00 0x7fff0000 return ALLOW
peter50216
,但 david942j 應該是使用頻率最多的 (?)
最後解釋一下,今天的標題是來自於在 david942j 當年發過的一篇 FB .... XD
事件的後續變成:
「david942j 只能對付二次元的bug,好可悲」
「可是我有三次元的女朋友」
╰(〒皿〒)╯
今天這題是 david942j 在寫 one_gadget tool 的時候順便出的題目,藉此來推銷自己的 one_gadget XDD
題目故意設計成 one gadget 無法使用的環境,但又沒辦法有夠長的 stack overflow 做 ROP,只能剛好蓋到 ret 和 ret + 8,只能控制兩次 RIP
這題的環境能用的 one gadget 有:
0x4557a execve("/bin/sh", rsp+0x30, environ)
constraints:
[rsp+0x30] == NULL
0xcde41 execve("/bin/sh", r15, r13)
constraints:
[r15] == NULL || r15 == NULL
[r13] == NULL || r13 == NULL
0xce0e1 execve("/bin/sh", [rbp-0x78], [rbp-0x50])
constraints:
[[rbp-0x78]] == NULL || [rbp-0x78] == NULL
[[rbp-0x50]] == NULL || [rbp-0x50] == NULL
0xf1651 execve("/bin/sh", rsp+0x40, environ)
constraints:
[rsp+0x40] == NULL
0xf24cb execve("/bin/sh", rsp+0x60, environ)
constraints:
[rsp+0x60] == NULL
上述條件一個都不能用,不是 stack 上剛好有渣渣,就是 register 故意被設值導致無法使用
直觀的想法是:
沒錯這題就是這麼樸實無華且枯燥 ... XD 要在茫茫的 libc 的大海中符合兩者的 gadget,如果不用 david942j 的 one_gadget,在檢查每個可用的 one gadget 條件時就會花去很多時間.....
最後解法其實滿多種的,可以參考當時 yuawn (現在是 balsn 的成員) 的解法:
r9
和 rdx
就可以成功執行 execve("/bin/sh", NULL, NULL);
malloc
完會將 r9 和 rdx 設成 0pusheen 的 david942j
簡單介紹一下背景,id 讀音是 大衛 924 街,聽起來很像 貝克街 221 號 B 之類,不明覺厲 XDD
大衛942街吧!XD
fixed. QQ