BUUCTF reverse1

在这里插入图片描述

BUUCTF reverse1

查壳

用exeinfope查看,显示100%packed,这个文件貌似是签名不完整无法确定壳的类型是什么,但加了壳对静态分析的影响不太大(相对动态分析而言,动态分析的话貌似得手动脱壳,我对动态分析还不太会,等以后学会了再写文章来详细说)。
在这里插入图片描述

用IDA静态分析

在这里插入图片描述
进来以后翻找一下左边的函数窗口,没有发现main函数,这里提一个小技巧,SHITF + F12快捷键可以打开string window(字符串窗口),看看有没有什么线索。
在这里插入图片描述
果然在最下边一行发现了格式非常像flag的东东,双击它进入汇编界面。
在这里插入图片描述
后边的DATA_XRTF叫做交叉引用,就是字面意思啦,后边的这个抽象的函数sub_1400118C0里边用到了Str2这个字符串。双击这个函数进入到图形界面
在这里插入图片描述
这里可以用到一个IDA的神级功能“反编译”,按下F5,就可以得到伪代码,也就是反编译出来的代码,因为和源代码有出入,所以称为伪代码。
在这里插入图片描述
我们这里来一步步分析一下
在这里插入图片描述
signed __int64其实就是c语言里面大家很熟悉的long long类型,熟悉windows api的同学应该知道这是一个预定义类型

_#if defined (_INTEGRAL_MAX_BITS) && \
  _INTEGRAL_MAX_BITS >= 64
typedef signed __int64 int64;
typedef unsigned __int64 uint64;
#else
#error __int64 type not supported
#endif

size_t同理其实是unsigned int类型
在这里插入图片描述
上边这一段说实话有些抽象哈,暂时水平看不懂啥意思,不过还好不影响解题。再往下走。
在这里插入图片描述
这里大家不要被第一个if语句给看迷糊了,可以看出来这个if语句是跳出for循环的关键,j和j_strlen是没有任何关系的。双击j_strlen(Str2)进入这个函数可以看到
在这里插入图片描述
返回值是strlen(Str),意思就是把Str2的字符串长度赋值给v2,v8每次循环加一,v8大于v2时跳出循环。再往下看,看到
在这里插入图片描述
111和48这两个数对IDA不熟的同学肯定就蒙了,告诉大家两个快捷键,按h可以把ascii码切换16进制和10进制,按r可以切换到字符,或者鼠标右键这个数字也可以切换
在这里插入图片描述
把他们切换成字符后就很明了了
在这里插入图片描述
如果为o就改为0。经过变换之后Str2={hell0_w0rld},再往下走。
在这里插入图片描述
黄色高亮的函数推理分析应该是printf这个函数(毕竟点进去看也看不明白这个函数在干嘛…)。sub_14001128F看着像是scanf函数,而且正好再“input the flag"后边。
然后是一个字符串比较函数strncmp,他有三个参数,最后一个参数是比较的字符数,而strcmp是两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇"\0"为止。当str1和str2相等时,返回值为0,加上一个!(非),相等时调用sub_1400111D1函数,输出this is the right flag!\n。
到这里这个程序的大概逻辑就理清了,str2的值经过o向0的变化,就得到了str1的值
在这里插入图片描述
那么str1就是{hell0_w0rld}咯,flag就得到啦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chneft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值