polictf2015 re350 wp

Author Avatar
Xzhah 7月 05, 2017
  • 在其它设备中阅读本文章

#####polictf2015 re350 wp

题目介绍

这是一道加了壳的elf文件。并且对文件分段解密七次。上学期期末时候,这道题我丝毫没有办法。现在我能利用两种不同的方法解决这个题目,也是自己的一种成长吧。

*传统方法

首先要找到他对壳处理完的地方,也就是壳与真正程序的分界线。也就是下图所示

这时候你把他dump出来,再丢进IDA,就可以静态分析其逻辑再结合动态调试就行了。

内在逻辑

第一段检验是检验你是否再命令行参数输入了字符
第二段检验是你的格式是不是flag{}这样的格式(题目事先告诉了应该用flag{key}这样的格式)

第三段则是对key的第一部分检验,这段十分简单,明文对比。用动态调试就行,现在我们得到格式应该为flag{packerxxxxxxxx}了

第四段是最难的,我看国外的WP。有位大神用subprocess+PIN解决的。我也打算花时间学学这两个和z3。神器啊。当然,我也看到有铁脑壳说他是一个一个试出来的,他说这是magic float。这份毅力,小弟佩服。

其实仔细看这段逻辑,只是看着吓人。冷静分析还是并不困难。首先,a6的值是已知数组的值。如果你输入的字符的ASCII码值是k,他比较2^k与9.223372036854776e18的大小。也就是比k是比63大还是小。如果比63大,他与9.22…的差与0x8000…..进行异或
处理,那么得到的肯定是负数。然后4*这个负数只能是是负数或者说为0(溢出)吧。(a6并没有为负数的情况,所以写脚本的时候只用在意0这个特例就行了)这时你看看a6,如果他为正时,那么多半你输入的数的ascii码是小于’?’的。也就是执行的v7=v6。那这就很容易解出了
进一步得到格式为flag{packer-15-4-?41=-xxxxxx}
第五段,十分简单,不赘述了。值得一提的是,可以用z3来解决,就当练练手。

最后,判断长度是否是33

我们就知道,flag是flag{packer-15-4-?41=-in-th3-4ss}啦

*第二种方法。利用IDA远程调试LINUX文件

首先要感谢刘师兄,他很耐心地手把手教我的。
首先将IDA里的dbgsrv文件夹里的linux_server复制粘贴在linux中
然后运行得到一个端口号
进入IDA 选择Debugger->start process
最上面两行以/root/桌面/re350的形式
第三行以/root/桌面/的形式
Port是选定的端口 parameters一项输入参数 比如命令行参数 file 12346 这里123456就是parameters的内容
最后hostname输入linux的ip 就可以啦
这个方法用来处理带壳的elf文件非常方便,我刚学会的时候,我的反应是,还有这种骚操作?

*后记

大一上期末的时候时拿这个题毫无办法,当时对我的打击也比较大。后来战略性的先放弃这道题了。
现在正好是大一下刚考完,一个学期过去。我能感觉到自己在进步。
希望自己能进步得再快一点,下学期花更多的时间在技术上。
贵在坚持。