-
-
[原创]第三题 寻踪觅源
-
发表于: 2020-4-18 11:10 4173
-
lelfei_fix.exe 拖进 IDA 里看一下字符串,可以确定这个题和 quickjs 有关。是 qjsc 编译一个 .js 的输出。
下载了最新的 2020-04-12 版本,自己编译一个 quickjs, 然后用 qjsc 编译 examples/hello.js, qjsc -e -o hello.c examples/hello.js
,可以得到 hello.c。
在 hello.c 里面可以看到 .js 编译出的字节码 qjsc_hello。然后在 exe 文件中寻找字节码,根据前缀 qjsc_ 很容以找到 _qjsc_s,可以判断其长度 988,内容如下。并且主程序将输入的 name 和 sn 拷贝到 &_qjsc_s[23] 和 &_qjsc_s[40],然后这道题和原 exe 文件就没有关系了。
将 hello.c 文件中的字节码和长度替换为 _qjsc_s,988,并 使用 gcc -D _GNU_SOURCE -I . -o hello hello.c ./libquickjs.a -lm -ldl
编译后运行,结果崩溃了 Segmentation fault (core dumped)
,这就很尴尬了。折腾了一番发现不同版本的 quickjs 编译出的字节码并不相同,然后从一个一个版本往前试,2020-03-16 版本还是崩溃,2020-01-19 版就好了。
能够正确执行字节码之后,可以修改 quickjs.c 文件,将所有执行的字节码打印出来,结合 quickjs-opcode.h 文件,可以得到字节码和定义。
又折腾了 一番发现,里面关键的 opcode 只有 add, sub, mul, div, mod, xor, sar。将这些字节码的参数和结果打印出来,基本就可以确定运算过程了,这个过程依旧很麻烦。
正向过程如下
逆过程如下
sn 为 40017535dad01714402635730122
。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课