【160Crackme】《keygenme1》

Crackme

Posted by Corax on September 30, 2023

上来先看一下程序信息 打开页面后输入username和序列号 check之后报错了。 既然没壳,直接扔od里面。 定位关键字符串 然后追踪到goodboy的地方,可以看到这里有个关键跳,决定这个程序报的是正确还是错误 。 试运行一下这个程序,输入错误的信息,然后运行到这个跳 可以看到这里的信息是不跳转,我们修改zf标志位 成功了,可以看到这个程序的爆破很简单。 。 接下里把算法给逆出来 首先是两个很明显的获取输入用户名和序列号 这里的这些不用管,是about会出现的信息 随后获取字符串的长度,然后和0x4和0x32(也就是50)进行比较,这里用到了jl和jg的内容 具体这个cmp其实可以理解成一个减法公式,如果结果是负数,则sf符号位记为1,jl根据sf进行决定是否跳转 然后下面遇到的第一个关键点是这里 按照顺序给我字符串字符的ascii,然后减去19,然后ebx为上一个ebx减去eax,循环次数为字符串长度 出循环之后ebx的值就是ffffff9a 经由一个wprintfa打出来 然后是第二个字符串的处理 详细的步骤写注释上了。 出来之后数据室FFEFCEA8 然后是第三个 这玩意相对奇怪一点,在40129B上面的处理当中用了之前的ebx,处理到eax,为40e0f8,然后自乘,是有溢出的。 也就是,无论我们输入的值为多少,最后ecx又ebx自乘,必定溢出,低位必定相同,直接看这次的是多少 41720f48。 拿之前输入的试试,没错。可以写注册机了

第一个 第二个

username="huangyongyong"
key0="Bon"
hjnum=0
eax=0
ebx=0
for i in username:
    eax=ord(i)
    eax=eax-0x19
    ebx=ebx-eax
str1=-ebx-1
str2=hex(str1^0xffffffff+0)
key1=str2.upper()[2:10]
eax=ebx*ebx
ecx=eax
edx=0-ebx
edx=edx^eax
ebx=-ebx*eax-1
str3=hex(ebx^0xffffffff)
key2=str3.upper()[2:10]
key3="41720F48"
key=key0+"-"+key1+"-"+key2+"-"+key3
print(key)

测试一下 成功