171020 逆向-Reversing.kr(Multiplicative)

来源:互联网 发布:ubuntu安装 虚拟机 编辑:程序博客网 时间:2024/06/05 22:19

1625-5 王子昂 总结《2017年10月20日》 【连续第385天总结】
A. reversing.kr
B.

Multiplicative

这次是JAVA题目,下载下来是仅有2KB的jar文件
感觉应该很简单?

解压缩出来一个MF文件,一个class文件
class里存放着java虚拟机执行用的字节码,所以其实java反编译起来相对而言应该是比较简单的

拖入惯用的jd-gui就打脸了
空空如也╮(╯_╰)╭
也不知道是我版本不对劲还是混淆还是天时地利人和不对

先试着运行一下吧,java虚拟机应该可以直接执行jar文件的,查了一下加上-jar参数就可以了:
这里写图片描述
哦~成功了
前边都是介绍,最后一行说明输入参数为64位有符号整数
那么输入范围应该是-2^63 ~ 2^63咯

然而我还是不知道内部运算是啥嘛~

查了一下字节码的反编译,发现有javap这个自带的工具可用,加上-c参数可以得到反汇编:
这里写图片描述
这样终于得到汇编啦……挺像smali的吼,虽然我已经把以前看的smali都忘了233

复制下来,大概浏览了一下,前面部分的常量都是介绍文字的输出,可以从注释中看出来
关键部分在这里:
这里写图片描述
读入long类型的数,乘26729后与-1536balabala比较,要求相等

记事本中的l和1是相同的,简直要瞎了我的狗眼……long类型的数字最后加L,这个坑浪费了我不少时间QAQ

另外,-1536balabala是有符号数,无符号的值是2^64 - 1536balabala,即
这里写图片描述
(Win10计算器大法好)

于是拿这个数除以26729就好啦~
这里写图片描述

嗯?这个小数点是怎么回事儿,这可不是个64位的有符号整数啊

除不尽说明啥?
说明真正的乘积不是这个-1536balabala呀,java的long类型只能保存64位,更高位由于溢出就丢失咯

那么我们就穷举被丢失的位呗,脚本跑一下:

i = 1while(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:
这里写图片描述
函数也清晰了,数字的L也大写了,命令也直白了,溢出的有符号数还被转成十六进制无符号数了~简直太清爽了~为我浪费的时间默哀OTZ

PS:今天跳过了CRC1,因为以前@zbnysjwsnd8让我提前看过,算法很简单,就是CRC64,权值是很常见的类型,但是并不会逆求啊(╯‵□′)╯︵┻━┻
费了很大的功夫才理解了CRC的算法和查表法,查到了反构的资料http://blog.csdn.net/sugar13/article/details/51029312,但是理解起来很困难。
之前一直抱着想要理解透再自己写算法的想法
最后想通了(:з」∠)数学编码学密码学不是我能触及的,乖乖站在巨人的肩膀上用查到的资料和算法解题吧……

C. 明日计划
reversing.kr
CRC反构

原创粉丝点击