如何PWN掉一个卡西欧计算器

First Post:

Last Update:

Word Count:
904

Read Time:
3 min

如何PWN掉一个卡西欧计算器

在高中时期参加过物理竞赛,获得了一个超级计算器CASIO fx991 CNX,此计算器陪我征战几年如今已经战痕累累,这几天突然想起来高中时期在贴吧听说过CASIO的一些神奇操作。当时啥也不会狗屁不懂,如今会了些许代码之后突然想起来这事,于是便打算对CASIO一探究竟。

CASIO字符转换器的原理:

常规的非正常操作是字符转换,用卡西欧输出一些诸如“I love you”之类的字符串,卡西欧中所有字符都是以一个或两个字节储存的,比如单字节的31对应数字1,77对应sin,7D对应log,23对应冒号,等等;常数和单位转换都是双字节的,其中常数(在卡西欧内部,Ran#也被视为常数)的第一个字节都是FD,单位转换的第一个字节都是FE,赋值操作的第一个字节都是FB。卡西欧的算式是由大量字节构成的,计算器会从左到右读取字节,如果遇到FD,FE或FB这些特殊字节,就会和下一个字节拼成一个字符。
而bug在于:lbf/in2→kpa对应的存储值为FE23,而23正好是冒号。用卡西欧比较多的人应该都知道,如果一个算式中有冒号,我们查看历史记录时,冒号及冒号右边的部分是不显示的。于是,23字节被删除,本来不可能单独出现的FE字节就出现在了算式的最右侧。此时在FE字节的后面添加东西就可以弄出一些非法字符,比如在FE的后面加上一个Ran#(对应FD18),计算器就会把FE和FD拼在一起构成那个t开头E结尾的乱码,剩下的单字节18构成非法字符@。构造出漏洞之后便可以间接对内存进行操作,轻者输出特定字符,重者直接死机。

漏洞复现

payload(大概)

上图就是传说中的”hack代码”,在CASIO fx991上面按照从左到右从上到下的顺序输入之后,整个计算器就会强制关机并且无法正常启动,只有打开后盖重新安装电池才能再次启动,杀伤力不容小觑,是否对计算器有永久伤害未知。

bug触发

第一行的操作是使用lbf/in2→kpa来构造漏洞基础

在执行到第二行的 SHIFT . 之后,屏幕上已经出现了乱码,如图所示,此时已经可以通过按键来对内存进行修改操作

执行完上述操作后,我的计算器成功死机,但是螺丝刀不在身旁没法拆后盖,悲

结语

最后贴个远古巨坟,这里面是贴吧大佬整理的关于卡西欧系列计算器的种种研究发现,感谢这些致力于研究卡西欧计算器的前辈们,这种只为兴趣不图名利的精神让人怀念,感慨那个“过去的好时代”。同样也以此博客纪念一下我那一事无成的物理竞赛生涯,那是我高中时期最快乐也是最充满激情的时期,如今早已物是人非,没了当年的干劲和热情。

无论是谁访问了这个博文,祝你今天有个好心情,也祝你永远忠于热爱。