【动调】【反调试绕过】【花指令nop】【buu】buu_crackMe
【动调】【反调试绕过】【花指令nop】【buu】buu_crackMe
也是去找了一个wp+学长帮助才出的这道题
差壳无可32位进入ida进入main函数
发现4011A0这个函数好像未被分析成功
跟进查看,发现有红名
把这里的花指令给nop掉:
然后把红名部分全部选中然后摁P进行重新分析成函数,
然后摁f5查看伪函数,整理后如下
BYD被骗了
回到main函数整理一下
查看sub_401830
有点长,分析一下,
上半部分主要还是检验是不是字符串一类的程序,但是要注意这个反调试
从**while ( v5 < 8 )**开始分析
这个v5<8就已经说明了密码是8位
首先是要对byte_416050进行一系列操作
然后检测调试,如果是在调试状态就进入该语句(但是正常的情况下不应该执行它,所以我们等下用ida调试的时候要绕过反调试)
然后执行密码加密 v16[v5] = byte_416050[(v7 + v12)] ^ v15[v4 - 1]
v16就是加密后的密码,它参与下一个函数的加密
紧着到来的是另一个调试检测
然后进入到sub_401710(加密函数)用处理过的byte_416050,输入的用户名和循环系数v5进行一段处理
最后进入到sub_401470(v16, &v13)和密文进行比对
跟进sub_401470(v16, &v13),发现这也是有反调试上了
现在进行绕过反调试
选中NtCurrentPeb,摁Tab,就会进入到该函数所在的汇编段内
蓝色的框就是反调试代码所在的汇编块,然后把 jz改成jmp 即可(改蓝色框的就行)
(动调的时候改zf值也行,不过这题这么改有点麻烦)
再摁F5查看伪代码
觉得还是有点抽象把aam和daa給nop掉就可以了
得到密文:
密文是
1 | dbappsec |
然后回到上一级函数中,给三个反调试的 汇编部分的jz 打上断点
一会动调再把他们改成jmp(别问为什么,我的ida就这样)
以防直接进入到语句,在这里再打个断点
回到伪代码跟进下加密函数sub_401710
这第一个if的一坨也是个反调试,所以正确的加密应该是下面的else if——else
v4是用户名的长度,v3的最大值是密码的长度为8
所以v3恒小于v4,只执行 else if 的加密
a1是经过上一个函数加密后的密码(上一层的加密v16[v5] = byte_416050[(v7 + v12)] ^ v15[v4 - 1])
a2是用户名,所以加密就是把正确密码和用户名前八位进行异或
回到上一层的函数点击v16[v5] = byte_416050[(v7 + v12)] ^ v15[v4 - 1]
tab跟进汇编代码
movzx ecx, [ebp+var_209]是将byte_416050的值存入ecx,此处的ecx的值即为我们想要知道的值!
所以开启动调
输入用户名和随便8位密码
停在了我们刚才打断点的地方,我们需要把上面说要改的jz改成jmp
然后运行让指令运行在这里
然后摁单步执行查看ecx的值就可以了,
最终得到异或的值为:
1 | 0x2a,0xd7,0x92,0xe9,0x53,0xe2,0xc4,0xcd |
现在可以写脚本了
1 | xor = [0x2a, 0xd7, 0x92, 0xe9, 0x53, 0xe2, 0xc4, 0xcd] |
得出的flag再找个在线加密网站进行加密就可以了