【Reversing.kr】Multipcative
本帖最后由 whklhh 于 2017-10-21 03:38 编辑Reversing.kr是韩国的一个逆向题目网站
有分国度的排行榜,还是挺有意思的
本题即来自于第二十四关Multiplicative
http://reversing.kr/challenge.php可以下载到文件
这次是JAVA题目,下载下来是仅有2KB的jar文件
感觉应该很简单?解压缩出来一个MF文件,一个class文件
class里存放着java虚拟机执行用的字节码,所以其实java反编译起来相对而言应该是比较简单的拖入惯用的jd-gui就打脸了
空空如也╮(╯_╰)╭
也不知道是我版本不对劲还是混淆还是天时地利人和不对
先试着运行一下吧,java虚拟机应该可以直接执行jar文件的,查了一下加上-jar参数就可以了:
http://img.blog.csdn.net/20171021025722189?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
哦~成功了
前边都是介绍,最后一行说明输入参数为64位有符号整数
那么输入范围应该是-2^63 ~ 2^63咯
然而我还是不知道内部运算是啥嘛~
查了一下字节码的反编译,发现有javap这个自带的工具可用,加上-c参数可以得到反汇编:
http://img.blog.csdn.net/20171021025930427?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
这样终于得到汇编啦……挺像smali的吼,虽然我已经把以前看的smali都忘了233
复制下来,大概浏览了一下,前面部分的常量都是介绍文字的输出,可以从注释中看出来
关键部分在这里:
http://img.blog.csdn.net/20171021030232959?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
读入long类型的数,乘26729后与-1536balabala比较,要求相等
记事本中的l和1是相同的,简直要瞎了我的狗眼……
long类型的数字最后加L,这个坑浪费了我不少时间QAQ
另外,-1536balabala是有符号数,无符号的值是2^64 - 1536balabala,即
http://img.blog.csdn.net/20171021030913850?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
(Win10计算器大法好)
于是拿这个数除以26729就好啦~
http://img.blog.csdn.net/20171021031258437?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
嗯?这个小数点是怎么回事儿,这可不是个64位的有符号整数啊
除不尽说明啥?
说明真正的乘积不是这个-1536balabala呀,java的long类型只能保存64位,更高位由于溢出就丢失咯
那么我们就穷举被丢失的位呗,脚本跑一下:
i = 1
while(1):
k = i * (2**64) + 0xEAAEB43E477B8487
if(k % 26729 == 0):
print(k//26729)
break
else:
i += 1
瞬间得到数字:9468659231510783855
输入以后程序还是提示64位有符号数,说明这东西超出范围,应该是个负数咯
那么将print处的代码修正一下:
print('-%d'% (2**64 - k//26729))
这样就得到转换的负数啦
提交,完成
另外在复盘的时候从http://invicsfate.cc/的WP中了解到了新的好使的反编译工具–jad和dj~
下载了jad,反编译出来好读多了QAQ:
http://img.blog.csdn.net/20171021032504332?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
函数也清晰了,数字的L也大写了,命令也直白了,溢出的有符号数还被转成十六进制无符号数了~简直太清爽了~为我浪费的时间默哀OTZ
PS:今天跳过了CRC1,因为以前@zbnysjwsnd8让我提前看过,算法很简单,就是CRC64,权值是很常见的类型,但是并不会逆求啊(╯‵□′)╯︵┻━┻
费了很大的功夫才理解了CRC的算法和查表法,查到了反构的资料http://blog.csdn.net/sugar13/article/details/51029312,但是理解起来很困难。
之前一直抱着想要理解透再自己写算法的想法
最后想通了(:з」∠)
数学编码学密码学不是我能触及的,乖乖站在巨人的肩膀上用查到的资料和算法解题吧…… 貌似是java语言的 哇居然只有2KB
页:
[1]