【动调】【反调试绕过】【花指令nop】【buu】buu_crackMe


也是去找了一个wp+学长帮助才出的这道题


差壳无可32位进入ida进入main函数

main

发现4011A0这个函数好像未被分析成功

跟进查看,发现有红名

4011A0

把这里的花指令给nop掉:

反复横跳的花指令

然后把红名部分全部选中然后摁P进行重新分析成函数,

去花后

然后摁f5查看伪函数,整理后如下

congratulation

BYD被骗了

回到main函数整理一下

main_fix

查看sub_401830

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),发现这也是有反调试上了

sub_401470

现在进行绕过反调试

选中NtCurrentPeb,摁Tab,就会进入到该函数所在的汇编段内

反调试1

蓝色的框就是反调试代码所在的汇编块,然后把 jz改成jmp 即可(改蓝色框的就行)

(动调的时候改zf值也行,不过这题这么改有点麻烦)

再摁F5查看伪代码

去反调试-密文

觉得还是有点抽象把aam和daa給nop掉就可以了

得到密文:

密文

密文是

1
dbappsec

然后回到上一级函数中,给三个反调试的 汇编部分的jz 打上断点

一会动调再把他们改成jmp(别问为什么,我的ida就这样)

以防直接进入到语句,在这里再打个断点

断点

回到伪代码跟进下加密函数sub_401710

enc

这第一个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跟进汇编代码

xor

movzx ecx, [ebp+var_209]是将byte_416050的值存入ecx,此处的ecx的值即为我们想要知道的值!

所以开启动调

输入用户名和随便8位密码

停在了我们刚才打断点的地方,我们需要把上面说要改的jz改成jmp

然后运行让指令运行在这里

动调1

然后摁单步执行查看ecx的值就可以了,

最终得到异或的值为:

1
0x2a,0xd7,0x92,0xe9,0x53,0xe2,0xc4,0xcd

现在可以写脚本了

1
2
3
4
5
6
7
8
xor = [0x2a, 0xd7, 0x92, 0xe9, 0x53, 0xe2, 0xc4, 0xcd]
enc = 'dbappsec'
flag=''

for i in range(len(enc)):
flag += hex(xor[i] ^ ord(enc[i]))[2:]

print(flag)

得出的flag再找个在线加密网站进行加密就可以了