unholy Writeup
这周末和小伙伴们一起打BKPCTF,我一个web狗,竟然撸逆向停不下来。。。撸了两个晚上。。。终于撸出来了。。
unholy这题说是ruby+python,其实我觉得主要还是逆C。。
1 | main.rb |
一个很简单的ruby脚本,不过这里需要装libruby2.1才能跑。。。(自己装装就知道了,国内装libruby2.1有点坑)
然后重点在于unholy.so,丢到ida中逆向看看,有几个重要的地方,主要是method_check_key
函数,也就是ruby里的is_key_correct?
这个函数规定了只能传入长度为9的int型数组
1 | mov [rsp+13E8h+matrix+24h], 61735320h ; matrix[9] = 0x61735320 |
形成长度为10的数组,然后经过如下算法
1 | loc_BFC: ; CODE XREF: method_check_key+112j |
这个算法转换用python写是:
1 | for i in xrange(0, 10, 2): |
最后输出的数组
1 | cmp [rsp+13E8h+matrix+24h], 4DE3F9FDh ; matrix[9] == 0x4DE3F9FD |
如果第十个数的值为0x4DE3F9FD, 则把前9个值传入下面的python脚本
1 | import struct |
然后算出X
1 | X=[ |
所以上面那个算法的输出要为:
1 | matrix = [-1304886577,722035088,1368334760,1473172750,412774077,-908901225,-490967005,563111828,-952589187, 1306786301] |
然后逆向算法最后得出脚本
1 | # reserve.py |
这里有几个重要的地方,坑了我好久,一个是优先级的问题,比如x ^ y + z
这个其实是 x ^ (y + z)
还有一个,就是python不需要定义变量类型,而matrix十个值为uint_32, 所以python 就要通过ctypes进行转换,还有flag也需要进行转换.
最后得出
1 | [1129335618, 1752909396, 544042349, 2036889439, 1684628512, 1696622880, 544105846, 1948282724, 2104715624, 1634947872] |
这个数组就是flag
1 | flag = "" |
unholy Writeup