-
-
[原创]看雪.Wifi万能钥匙 CTF 2017 第15题Writeup
-
发表于: 2017-6-30 19:16 3723
-
此题壳及混淆比较麻烦,没搞定,但是可以dump绕过壳,主要算法在luajit虚拟机内,整体算法比较简单,就是两个异或。所以完全可以不用理会混淆。下面说下过程。
拖进ida,发现有壳,其中还有混淆,有大量跳转。于是动态了下,由于真实指令在就混淆跳转中,没找到入口,放弃此办法。
直接运行程序,查看了进程,只有一个进程,直接dump。原文件大小是999kb,dump出来的有3M之多。
将dump出来的文件直接拖进ida,查看字串,发现多处含有lua
字样的字串,包括LuaJIT 2.1.0-beta3
、Lua 5.1
,估计是lua的虚拟机了。继续翻看,发现了程序的输入提示Pls Input Serial Number:
,其上下还有main
、Wrong!\r\n
、Congratulations!\r\n
,查看其引用,只有main
找到了显式引用,位置在4021EC
,大致看了下,此位置代码很可疑,而且main
这个词也很敏感啊,很有可以就是lua脚本的主函数名。
代码比较长,我就不全部上了。此函数或过程的入口应该在401000
或401005
,一波跳转后,过两条nop,来到40103D
,40103D
至4021C0
为向栈区写数据,这么大段的基本是硬编码的数据很可能是lua的脚本相关数据。
之后就是调用了几个函数,在402210
处有个根据函数返回的条件跳转。如果不跳,则返回0。
再看跳转目标处loc_40222C
的代码。先是12个sub_412CE0
调用,再接着是12个比较,如果不相同则返回0。 根据此处代码,我们可以推测,输入可能是12个,输出肯定是12个,12个比较是最终的校验。 动态验证下,运行程序,od附加,在40103D
下断并运行,程序中随便输入回车。成功断下。最后获得栈区的写入数据(前面似乎是luajit的头,也加上了)。
继续往下走,最后到了校验的地方,全部改标志位通过,最后程序打印出成功信息。看来推测是正确的。
更新了下luajit,使用luajit-decomp
反解数据,竟然解不出。 我想想觉得luajit太明显了,是不是坑,毕竟函数都没跟,不知道发生了什么,有可能只是luac的脚本。于是更改脚本数据,用luadec解,也是解不出。
后来得到高人指点:应该是luajit,看看版本对不对。我边看边想:不应该啊,我刚更新的,然后就傻眼了:版本不对。我又上了luajit的官网下载页,原来第一个并不是最新版本,只是稳定版本,当时着急没看版本号,就直接下了第一个。
重新下载编译,用luajit-decomp
反解,得到:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!