forgotten message
附件拖入ida。明文
kablewy
打开url会卡死,查看源代码
有一些base64串,解码一下
继续解码。原来是在无限循环输出,难怪卡死。解出的话一个一个拼接即可
Burger Reviewer
文本编辑器打开附件
check都比较简单,直接手撕
revsite1
wasm逆向,解出占运气。打开网页,F12
为鼠标click事件下断点或者在wasm文件的checkflag函数下断点
click事件中可以发现有一个指针。问gpt知道还把这个指针写入到wasm的内存里了
进入wasm,发现果然是输入字符串
继续调试,发现这三条代码看不懂,gpt也没解释清楚
查看var3处的内容,直接就出了
revsite2
打开url,有一个按钮,点击会新开一个标签页,播放老外们最喜欢的MV,同时分数+1
分数需要1e18即一百亿亿。F12打开控制台
试过用selenium库模拟点击并且通过关闭新页面的方式阻止打开新页面,但是次数并不增加。试过改js代码写个循环调用visit_ad方法并用本地文件替换,但是单是循环1000000次内存就到百分百占用直接卡死了。逃不了,只能分析,断点下好,进入调试
向下翻就能找到关键比较
诶,我有一计,试试能不能patch这个1e18。把wasm文件另存在本地,才发现居然是二进制文件
这里可以用ida9.0反汇编。函数很多,重点看visit_ad函数。当然,反编译是别想了,而且也不能patch
鼠标指针放在1e18上再转到hex view就能找到这句汇编对应的机器码
问题是不知道是怎么解码的,只能试着改改看。找到偏移后,修改在winhex里进行。试过多种修改方式后,发现下面这样可以把1e18修改为32
保存修改。另外,保存html、js文件,和wasm文件放在同一目录下
然后浏览器打开html文件,就能正常运行了。点击到31后再打开控制台
步过两个call后,发现调试自动结束了,并且报错了
不是哥们,真要点1e18次啊。wasm调用函数的传参是通过参数入栈实现的,查看函数的参数大致能猜出来函数的作用
那么怎么确定应该是哪个值对应的字符需要左移呢,回溯local2地址的值可以发现由内存地址[0x10310]的值决定
找找地址[0x10310]的值什么时候被修改,并且回溯计算。调试发现内存[0x10320]的值刚好就是分数
地址[0x10320]的值应该是1e18。写个脚本算算地址[0x10310]的值。计算通过数学公式(立方数列求和和平方数列求和)简化,具体细节由调试确定。另外,每次与[0x10310]有关的运算都有两部分,另一部分是左移的偏移,这里也卡了一段时间,明明都得到’}’了。明白这些之后,剩下的就是手撕一下运算
总结
玩服务器,找dk盾,更适合ctfer宝宝的体质
二进制确实很需要耐心,无论是rev还是pwn,特别是在面对大量汇编,甚至是大量机器码的情况下。一点一点做,只要方向方法对,总会得到结果的。不要害怕犯错,只要有备份,就还能从头再来