前面已經(jīng)了解了基本溢出原理以及玩法,對(duì)于991用戶來(lái)說(shuō)已經(jīng)足夠。但是對(duì)于82+A用戶來(lái)說(shuō),因?yàn)槿鄙倭丝茖W(xué)常數(shù)和進(jìn)制轉(zhuǎn)換功能,有很多符號(hào)要通過(guò)刷不穩(wěn)定字符獲得。這個(gè)過(guò)程相當(dāng)費(fèi)時(shí)而且枯燥。這一節(jié)我們特為82+A用戶講解一種可以避開(kāi)刷不穩(wěn)定字符獲得無(wú)法直接輸入的字符的方法——魔數(shù)法
原理
在前文我們已經(jīng)知道計(jì)算器將變量存儲(chǔ)在不穩(wěn)定字符的后方,存儲(chǔ)方式也已經(jīng)解出。那么,借助變量存儲(chǔ)獲得那些無(wú)法輸入的符號(hào)也成為一種可能。由前文知,當(dāng)用科學(xué)計(jì)數(shù)法存儲(chǔ)變量時(shí),采取了BCD碼的存儲(chǔ)方式。只需將特定的值賦予變量,那么在光標(biāo)溢出模式下就能從存儲(chǔ)變量的位置獲取到所需的字符。
困難
在正常情況下,BCD編碼中不會(huì)出現(xiàn)十六進(jìn)制字符A-F,使得符號(hào)表中只有01 - 99的部分可以獲得。嚴(yán)重限制了魔數(shù)法的應(yīng)用。盡管通過(guò)刷不穩(wěn)定字符的方式可以獲得Base-N模式下的A-F,但仍然麻煩且不實(shí)用(都已經(jīng)開(kāi)始刷不穩(wěn)定字符了還何必用魔數(shù)法呢?)。基于我個(gè)人的研究和user202729的啟發(fā),我發(fā)現(xiàn)了將魔數(shù)法與數(shù)學(xué)68結(jié)合的方法,可以解決上述困難。
簡(jiǎn)略步驟
- 通過(guò)異常STAT模式進(jìn)入數(shù)學(xué)68模式
- 利用帶框符號(hào)到線性的轉(zhuǎn)化獲取對(duì)應(yīng)十六進(jìn)制字符
F 通過(guò)帶分?jǐn)?shù)獲得,E 可通過(guò)帶分?jǐn)?shù)、n次冪和n次根號(hào)獲得,D可通過(guò)帶分?jǐn)?shù)、分?jǐn)?shù)線和n次根號(hào)獲得,C 可通過(guò)log框框、A 和 B 可通過(guò)任意帶框字符獲得
- 轉(zhuǎn)到線性并構(gòu)造魔數(shù)賦給適宜變量(建議變量M、Ans等)
注意:由于計(jì)算器對(duì)于某些數(shù)值存在自動(dòng)約整的情況,因此請(qǐng)注意盡量不要完全使用存儲(chǔ)底數(shù)的八個(gè)字節(jié),應(yīng)當(dāng)預(yù)留1或2個(gè)字節(jié)防止出現(xiàn)約整。(例:1.1212121212F2 在存儲(chǔ)到變量后,因?yàn)榧s整這一數(shù)值會(huì)直接變成 1.121212121400)
- 再進(jìn)入異常STAT模式并進(jìn)入光標(biāo)溢出
- 將獲得的字符移到輸入?yún)^(qū),并完成大半個(gè)ROP
- 再次進(jìn)入光標(biāo)溢出,刪除前面的
AAr
然后在最后完成整個(gè)ROP - 基本溢出
操作視頻
上面的內(nèi)容我覺(jué)得對(duì)于大多數(shù)人很難理解,本來(lái)這些內(nèi)容就比較抽象,那么直接看示例視頻吧。
bilibili