Crackme 24
来源:互联网 发布:iphone手机编程软件 编辑:程序博客网 时间:2024/05/16 10:37
还是上个系列
首先用OD打开搜索字符串
找到字符串的位置
发现判断条件,EBX 必须等于 0xAFFCCFFB
[4012D9] 必须等于 EB 26才能破解该软件,所以只需要两个条件
那么BX的值是由谁决定的呢
代码段由谁决定的呢
#bx = 0xfbfc30a3for i in range(0x0,0x100): for j in range(0x0,0x100): s = '0x' + hex(j)[2:] +'0'*(8-len(hex(j)[2:])) s = int(s,16) if i^s^0xfbfc30a3 == 0xaffccffb: print hex(i)+hex(j)
我们现在缕一下思路
1.我们要注册必须跳转到注册成功的语句(机器指令必须是EB 26),跳转的语句由[4012D9]处内存决定。而内存是由下面的代码计算出来的
004012B9 . 03C3 ADD EAX,EBX ; tr(name) + serial004012BB . 3105 D9124000 XOR DWORD PTR DS:[4012D9],EAX ; 0x00584554 ^ ax004012C1 . C1E8 10 SHR EAX,10 ; ax >> 10004012C4 . 66:2905 D9124>SUB WORD PTR DS:[4012D9],AX ; [4012d9] - ax
2.我们要完成下面的匹配及 BX == 0xAFFCFFB,那么BX由谁决定的,由下面的代码决定的(内存4011EC –4012DC异或形成的)。一开始以为这段数据是定值,最后发现有部分位置数据有变那就是[4012D9](也在数据范围内,由上面的代码生成)
004012DD > AD LODS DWORD PTR DS:[ESI] ; [4011ec]004012DE . |33D8 XOR EBX,EAX ; ax ^ bx004012E0 . |49 DEC ECX
解题:
我们的突破点在第二个条件。首先计算[4012D9]内的值应为多少现在已经确定了后前个字节(EB 26)首先令前后个字节[4012DB] 、[4012DC]为00 00,然后让程序直接跑到 CMP(注:这里有个大坑,绊了我半天,当设置一般断点时 将会把内存设置为0xCC 所以在数据段中不能设断点,这也太坑了)
然后观察BX的值,可以写脚本了
#爆内存脚本#bx = 0xfbfccfa3 i = 0x58 j = 0x54for i in range(0x0,0x100): for j in range(0x0,0x100): s = '0x' + hex(j)[2:] +'0'*(8-len(hex(j)[2:])) s = int(s,16) if i^s^0xfbfccfa3 == 0xaffccffb: print hex(i)+hex(j)
所以那两处的内存为0x58 0x54
内存出来了我们就相当于知道了[4011D9]处的内存开始解第一点
他计算内存的算法很简单
直接写注册机,有个地方一直使得答案不正确,那就是(xor&0x0000FFFF) - shr我已开始没有加括号 然而- 的优先级大于&。
直接导致计算错误,也是调了半天
s = raw_input("name:")name = s+'\x00'*(0x10-len(s))num = 0x58455443for i in range(0,len(s)): temp = int('0x'+'0'*(2-len(hex(ord(name[i+3]))[2:]))+hex(ord(name[i+3]))[2:]+ '0'*(2-len(hex(ord(name[i+2]))[2:]))+hex(ord(name[i+2]))[2:] + '0'*(2-len(hex(ord(name[i+1]))[2:]))+hex(ord(name[i+1]))[2:]+ '0'*(2-len(hex(ord(name[i]))[2:]))+hex(ord(name[i]))[2:],16) num += tempwhile 1: serial = 1 n = num + serial n = '0x'+hex(n)[-9:-1] n = int(n,16) xor = 0x00584554 ^ n shr = n>>0x10 if ((xor&0x0000FFFF) - shr) == 0x26EB and hex(xor)[:6] == "0x5854": print serial #break else: serial += 1 if serial%0x100000 == 0: print serial #[0x584554 ^ ax] - ax >> 10 = 0x585426EB
用python跑的很慢,用c比较好。但不影响最后的答案
0 0
- Crackme 24
- Triangle CrackMe
- CrackMe-crackhead
- crackme 网站
- Crackme 1
- Crackme 2
- Crackme 3
- Crackme 4
- Crackme 20
- Crackme 21
- Crackme 22
- Crackme 23
- Crackme 5
- Crackme 25
- Crackme 26
- Crackme 28
- Crackme 29
- Crackme 30
- 堆和栈的区别(转过无数次的文章)
- 适配器模式(Adapter):类适配器、对象适配器
- 从贝叶斯方法谈到贝叶斯网络
- java面试题(2)-集合相关面试题
- 利用二叉树设计同学录管理系统
- Crackme 24
- LeetCode-31. Next Permutation
- 树结构练习——排序二叉树的中序遍历
- 对于康拓展开的理解
- 对JDBC驱动注册--DriverManager.registerDriver和 Class.forName()的理解
- mysql内存优化
- sql
- glibc,EGLIBC, uclibc的区别
- 优信二手车以创新迎接机遇与挑战