本文作者:icq5f7a075d
Music起~
“啊门 啊前 一棵葡萄树,啊嫩 啊嫩 绿地刚发芽,蜗牛背着那重重地壳呀,一步一步地往上爬~”
上周分析勒索病毒(GlobeImposter),笔者感觉自己算法的逆向能力很弱,于是找了些题目练手。本文逆向程序主要来源于《加密与解密实战攻略》,算法将用Python/C++实现。
既然有了算法逆向1,自然会有2、3、4……叶问说“我要打十个!”,笔者说“我要写十篇!”,甭管行不行,先立Flag! ——>文末有福利
1. 简单的算法逆向
预计时间:2h
1.1. 定位关键位置先随便输入,弹出了错误提示:
搜索字符串:Invalid!此时已经找到了关键位置。
上下翻找一番,0×00404167就是关键跳转,如果是crackme,那么直接把这里修改为jmp就可以了。而我们要进行算法逆向,就要追踪分析ebx和esi这两个值怎么来的。
1.2. 算法逆向
往上回溯,ebx的值来自于下图,过程还是比较简单,对输入name字符串进行计算,得到一个值,以这个值为编号,在表0x4050B8中取值:
往上回溯,esi的值来自于此,也比较简单对输入密码字符串进行计算:
算法逆向源码(python):
calc_table=[0x19791126,0x19791007,0x11261979,0x10071979,\0x12345678,0x9abcdef0,0x12123434,0x78787878,\0xccc6ccc6,0xcc00cc00,0xffefefff,0xddcc5555,\0x67678787,0xcececbcc,0x778899ab,0x44337766]def calc_name(name):sum_name=0for i in range(0,len(name)):sum_name=sum_name+i*ord(name[i])#print hex(sum_name)calc_name1=(sum_name&0xFFFF)+((((2*len(name)+0×63)&0xFFFF)<<0×10))#print hex(calc_name1)calc_name2=calc_name1&0xFreturn calc_name2def calc_pass(password):str_pass='0'+passwordedx=0for i in range(0,len(str_pass)):edx=edx*2edx=edx+edx*4edx=edx+ord(str_pass[i])-0×30return edxname_in = raw_input("Input your name:")pass_in=raw_input("Input your pass:")print hex(calc_table[calc_name(name_in)])print hex(calc_pass(pass_in))
2. 解方程算法逆向
预计时间:4h
本程序虽然叫解方程算法,但是解方程算法只是本程序算法中的一小部分。
2.1. 定位关键算法
运行程序,随便输入name和serial,点击check没有