逆向学习DAY3

T6.exe

分析可知比较的是str1和str2(即input),而且str1是常量与我们的input输入无关,所以只要进行调试得到str1的值即可

这个调试的方法跟编译器的调试方法一样,就是设置断点,进入调试

  

T7.exe

 打开程序

分析可以知道input取决于

 

而且input的长度应为44位

此时我们按照动态调试来解决:

第一步:设置断点

第二步:进入调试

要注意

这个函数是反调试函数,就是我们不能直接在ida打开调试,会被其阻拦

所以我们首先要绕过反调试:打开程序,程序显示Welcome!give you flag!,然后用IDA的Attach to process来进入调试,这样就绕过了(因为printf语句在反调试函数的下面)

接着,记录input和内存地址,F8进入下一步,记录变化后的数据(G搜索内存地址查看),再用变化后的数据作为input重复操作查看结果是否与原来的input相同

注意因为调试时只能输入可见字符,而得到的结果有不可见字符,解决方式是先输入可见字符然后在对应的内存地址输入其十六进制的形式(选择 Paste Ddata选项)

 结果是相同的,说明

的加密和解密算法是一样的,所以我们只要以v7作为input就可以得到需要的输入了

得到的结果是E415C4EDA62F5610BB13EBAD7556C7BBBBE9B9CC023A509F369069BE7C4244CAC6D4245CD2B924C11893B3EA

再将得到的结果作为输入得到SYC{Pjx_s_Wom3n_cl0thing_1s_S0oo0o0_cute!1i}

 总结:这个方法就像黑盒测试只考虑输入和输出,而不去关心其函数内部是怎样的,来判断它的加密与解密是否相同

T8.exe

IDA识别函数可能会出错,比如函数的参数个数和参数类别,数组的长度

 1.函数

 可以发现此函数只在主函数出现一次(按x),并且函数的返回值没有被调用,所以我们可以按V键remove

return type(插件功能)即将函数返回值设为void

 

发现这个函数的参数个数应为0,解决方法进入函数按F5,再回来按一次F5即可

 2.函数

 

v10是strcmp 的一个参数,说明其是char*类型,所以将int a3的int改为char*

第一个参数说明其是指针类型

再看 说明其是int *类型,因为int类型占4个字节,这个就是int数组寻址

改为int *a1

3. 数组

 将125改为字符

 分析猜测str和source是同一个数组,将str的长度改为52

sub_401340==exit()

至此修正完成

 开始分析程序到底写了个啥: 

先判断输入格式是否是flag{xxx},再将xxx复制给Destination,然后接下来应该是两个加密算法吧,最后进行比较

if(-1),if中的语句会执行

sub_4011F0

 可以知道Destination是32位的,并将其与dword_404040数组进行异或,查看dword_404040

转成数组形式

sub_401270

分析可知这个应该是用a1来进行替换的加密

返回主函数查看a1

比较的对象

综上对对象进行替换和异或两步操作

用LazyIDA插件功能导出数据,写python脚本解密:

 

导出数据时遇到的问题(我直接手动导出了..,因为按原来的

 多了好多无效数据,看了视频知道要以

这种形式导出才正确)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值