攻防世界逆向高手题之梅津美治郎

99 篇文章 34 订阅

攻防世界逆向高手题之梅津美治郎

继续开启全栈梦想之逆向之旅~
这题是攻防世界逆向高手题的梅津美治郎
在这里插入图片描述
.
.
照例下载附件,扔入exeinfope中查看信息:
在这里插入图片描述
.
.
32位无壳,先运行一下程序看看主要回显信息:
在这里插入图片描述

照例扔入IDA32中查看伪代码,有main函数看main函数:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
.
.
(这里积累第一个经验)
第一、二副图中可以看到前面一堆数字,肯定有用的,冗余代码不会长这个样子。然后就是第三幅图中两个系统函数GetModuleHandleAGetProcAddress
查了手上所有的手册,一个获取模块名,一个获取模块名内函数。
在这里插入图片描述
在这里插入图片描述
.
.
所以前面的大量静态数字赋值就是用来间接构成字符串的,可是我用热键R转字符也没看出是什么函数啊:
在这里插入图片描述
.
(这里积累第二个经验)
现在回顾一下以前的积累,凡是与预期不符的结果,都是在中间有其他的操作,动调后发现,中间有个不起眼的sub_401500(0);函数进行前面字符串的修改:
在这里插入图片描述
在这里插入图片描述
.
.
.
(这里积累第三个经验)
动态调试后发现是kernel32.dll模块库的AddVectoredExceptionHandler函数,然后又把手册翻了个遍,大概是捕抓异常,然后用回调函数处理,所以v5((HMODULE)1, (LPCSTR)sub_40157F);就是捕抓异常然后给第一个处理函数sub_40157F处理。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
.
.
.
继续往下走,下面是一个输入和比较,str2是明文,所以直接复制粘贴r0b0RUlez!通过第一关。然后就程序回显出进please enter the second password!,找了strings窗口也没找到对应字符串在哪里,后来才发现下面还有个sub_4015EA(0);函数,真的,这种函数个体又小,又只有0参数,很容易让人忽略啊~
在这里插入图片描述
.
.
(这里积累第四个经验)
跟踪sub_4015EA(0);函数,一个递归打印dword_40AD90数组,这个数组在前面动调中是**please enter the second password!**字符串,关键是后面的__debugbreak函数,下面附上别人透彻的分析:

这里有个debugbreak函数,这函数的话,也就是相当于一个int 3指令,引发一个中断,把执行权移交给调试器,如果没有调试器,那就移交给其他异常处理回调函数,如果都没有,那么程序就自己断下来,这里就是为了触发回调函数,如果没有调试器附加,那么debugbreak产生的异常会被AddVectoredExceptionHandler添加的回调函数捕获来处理,这里添加的回调函数也就是sub_40157F函数。

在这里插入图片描述
.
.
那么整个程序每个环节都对上了,现在跟踪sub_40157F函数,please enter the second password! 字符串也在里面,关键就是框中的比较函数sub_401547(input_flag2, off_40AD98),是一个简单的异或而已,当然off_40AD98也是要动调才能看的,是u1nnf2lg
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
.
.
(这里积累第五个经验)
补充一下IDA停在__debugbreak函数中时继续单步调试要点击YES才可以,弹框内容大概是是否继续执行断点。
在这里插入图片描述
.
.
.
直接附上解题脚本:

key1="u1nnf2lg"
flag2=""
for i in key1:
	flag2+=chr(ord(i)^2)
print(flag2)

结果:
在这里插入图片描述

总flag就是下划线连起来flag{r0b0RUlez!_w3lld0ne}
.
.
.
总结:

1:
(这里积累第一个经验)
第一、二副图中可以看到前面一堆数字,肯定有用的,冗余代码不会长这个样子。然后就是第三幅图中两个系统函数GetModuleHandleAGetProcAddress
查了手上所有的手册,一个获取模块名,一个获取模块名内函数。

2:
(这里积累第二个经验)
现在回顾一下以前的积累,凡是与预期不符的结果,都是在中间有其他的操作,动调后发现,中间有个不起眼的sub_401500(0);函数进行前面字符串的修改。

3:
(这里积累第三个经验)
动态调试后发现是kernel32.dll模块库的AddVectoredExceptionHandler函数,然后又把手册翻了个遍,大概是捕抓异常,然后用回调函数处理,所以v5((HMODULE)1, (LPCSTR)sub_40157F);就是捕抓异常然后给第一个处理函数sub_40157F处理。

4:
(这里积累第四个经验)
跟踪sub_4015EA(0);函数,一个递归打印dword_40AD90数组,这个数组在前面动调中是**please enter
the second password!**字符串,关键是后面的__debugbreak函数,下面附上别人透彻的分析:
.
这里有个debugbreak函数,这函数的话,也就是相当于一个int 3指令,引发一个中断,把执行权移交给调试器,如果没有调试器,那就移交给其他异常处理回调函数,如果都没有,那么程序就自己断下来,这里就是为了触发回调函数,如果没有调试器附加,那么debugbreak产生的异常会被AddVectoredExceptionHandler添加的回调函数捕获来处理,这里添加的回调函数也就是sub_40157F函数。

5:
(这里积累第五个经验)
补充一下IDA停在__debugbreak函数中时继续单步调试要点击YES才可以,弹框内容大概是是否继续执行断点。

解毕!敬礼!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

沐一 · 林

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

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

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

打赏作者

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

抵扣说明:

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

余额充值