buu_re_crackMe

本题主要考察简单的绕过反调试,结合动态调试求值。

查壳

无壳32位

ida分析

输入用户名和密码。

发现花指令,无法反编译。

 

 将jbe和aaa那行nop掉,也将产生的这些数据nop掉。

最后得到这样。

 将所有左侧标红的地址选中,按p声明为函数,打开函数发现前面是Congratulations,后面是Please try again,并返回result值为1,所以v3==1。(下图没截完整)

 分析 sub_401830 函数

 发现里面有很多反调试的东西,大概有四处。

 正因为这些东西,如果我们直接debug则不能得出正确结果。

绕过反调试

先将光标定位到有反调试的伪代码那一行,按Tab键,跳转后再右键选择Text view,这样就可以修改汇编指令了,从而去除反调试代码的干扰。

将上图中的jz指令改为jmp指令,jmp对应的操作码为0xE8。同理,把其他几处也改一下。最后别忘了patch into file!!!

 完成后可重新查看一下执行流,发现反调试代码消失了,全部绕过。

动态调试 byte_416050 数组

如下图处下断点。第一张是我们所求数组的位置,也是关键代码处;第二章图发现此数组存入ecx中来进行异或的,调试时只用看ecx中的内容。

 我们已知用户名,所以直接输入,密码先随便输入一组字符串。

 然后F8单步过,注意观察ecx的值。

 最后得到byte_416050值为0x2a, 0xd7, 0x92, 0xe9, 0x53, 0xe2, 0xc4, 0xcd

EXP

byte_C26050 = [0x2a, 0xd7, 0x92, 0xe9, 0x53, 0xe2, 0xc4, 0xcd]
v17 = 'dbappsec'
flag=''

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

print(flag)
#4eb5f3992391a1ae

根据题目将结果进行MD5加密,得到flag。

flag{d2be2981b84f2a905669995873d6a36c} 

具体参考这位博主的wp,写的很好分析得更具体。

​​​​​​BUUCTF crackMe 题解

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值