Acid_burn
调查信息
拿到首先用exeinfope来看看:
- 没有壳
- Delphi 写的
运行来看看:
当打开的时候首先是这个界面:说明等会需要将这里给nop掉,需要将这个界面给kill掉
然后是:
有2个Serial
第一个是:用户名和序列号
第二个是:只用序列号
大致的看一看这个程序它是在干什么的。
关掉第一个窗口
首先我们需要破解的是:将第一个窗口给关掉【在运行的时候不会弹第一个窗口】
我们通过关键字:hello you have to kill me 来进行定位。
我们用x32dbg来打开,然后寻找一下字符串:
通过关键字进行定位:
定位过去:
我们首先在这个call上面的push 0 下一个断点
然后我们F8单步运行一下。得知在运行下面这个call的时候第一个窗口就会弹出来。
这里就有2个思路:
- 把下面调用窗口的这个call给nop掉
- 返回到主程序,让它不跳转 过来。里面下面的ret就能知道它主程序的位置。
尝试第一种:
将这个call给nop掉的话,在运行的时候会报错。所以这里我们尝试第二种方法。
我们重新载入这个程序:
这里可以看到堆栈里面的返回值【因为ret指令是pop ip】或者我们也可以双击ret就能回去。
跟进后:返回到 xor eax,eax这里
看到上面这个call 说明这个call 就是调用我们之前的那个的call。向上看:看到je,跳转到xor eax, eax这个位置。
这里我们又有2中思路:
- 将je 改成jmp
- 将这个的这个call 给nop掉
我这里尝试的是第二种方法【nop】
这里看到确实是没有第一个弹窗说明这个方法 可行,并且程序也是正常的。
所以我们就将他保存:
右键–>补丁–>修补文件
这里文件名字需要你自己输入:xxx.exe
当你去运行的时候:
发现是直接到这个窗口了。说明成功了!!
第一个序列和名字
我们通过字符串搜索进行定位:
发现这里有3个Try Again
通过尝试:设置断点重新运行程序。看当点击:check it baby 的时候段下来了,就说明是这个Try Again
当我们找到这个Try Again的时候就往上看:找到push ebp的位置。至于为什么是push ebp 是因为push ebp是保存上一个环境,就说明这里下面开始是一个新的环境,就是你要找的位置。
然后我们F8单步一直往下一下
看到这里有一个跳转,可以知道当我们输入错误的序列号的时候它就跳到失败的位置了。
其实我们看到上面:已经有成功的序列号
CW-6560-CRACKED
这里呢:它有一个jne的跳转,我们将它nop掉,就能直接运行到成功的位置。
”重新运行“NOP掉后来点击check :这个时候不论输入正确与否的序列号都正确了。
我们将它保存下来:
现在我们来找正确的序列号:
因为上面我们看到了比较函数的传参的序列号,我们用原来的程序来进行尝试一下。发现序列号就是对的。
但是我们换了一下name 再次使用这个序列号的时候就错误了:
这个时候我们就猜测:序列号和用于名有联系。
这里就是我们需要去逆向的,找到用户名和序列号之间的算法。
从下往上找。
首先看比较函数的call,传入的参数的地址,在往上找这个地址中的值咋来的。一步一步往上看。
最后就能分析出来是将字符串的第一个字符的ASCII*0x29后*2 转成10进制。
我们来看看Wp:
少了一步*2的过程
看了WP后知道:原来进行定位的话可以用DeDe来进行定位:
在DeDe里面能看到地址来进行定位一下。