作者:
int0x80 (請逐項修改)
2022-06-26 04:37:41仔細想想 逆向工程這件事似乎不是很好 formalize
和混淆不同 混淆蠻容易定義的
例如定義完美的混淆器為:
即使攻擊者拿到混淆過後的程式碼
攻擊者能做到的事 和單純拿到oracle能做到的事一模一樣
(也就是只知道輸入輸出對應關係)
雖然這種混淆器已經在 2001 年被證明不可能達成了
不過定義混淆這件事還是蠻容易的
或是像 indistinguishability obfuscation 的定義方式
兩個輸入輸出相同的 circuit 經過混淆器後沒有辦法分辨
這也是一種定義方式
但相反的 怎樣算是逆向成功 就有點麻煩了
感覺最好的說法是:
知道這支程式「在幹麻」
而這個「在幹麻」必須是人類可以理解的樣子
但這樣就會是主觀的了
例如你拿到一個算平方的程式,如果你說你逆向的結果是
輸入1會回傳1、輸入2會回傳4,...一直到int的上限的話
沒人會當你成功逆向了
或是你的結果是一串不是很明顯知道在幹麻的指令:
先push某個值在幹麻幹麻的,也沒有人會當你逆向成功
必須說出這個程式是在算「平方」才行
再舉一個例子,假如有一個程式
在輸入 >=0 時會輸出它的平方根
而 <0 的部份則被塞了一大堆垃圾程式碼
經過編譯後到你手上 怎樣算是成功逆向呢
應該只要能說出:
>=0 時會輸出平方根,否則是垃圾
這樣就可以了 不需要知道 <0 時到底確切是什麼行為
甚至可以說如果還花力氣去看 <0 的部份的話就是被對方拐了
因為這部份「不重要」
也就是說,逆向這件事是和「人」的目的密切相關的
比較像是在問:當初作者是因為什麼原因而寫下這個程式的
應該很難正式的定義什麼是逆向