这道题呢是在“墨者学院”上看到的,题目是“逆向分析实训-exe(第2题)“,文末有惊喜,本着学习逆向的想法就去做了下这道题,虽然结果变成了C语言代码审计。。。
另外在做这道题的过程中参考了另外一个大佬的文章,在末尾会给出链接。。。
本人只是一只想学习逆向的菜鸟,文章里可能有错误会不准确的地方,如果有发现请告诉我,非常感谢,没钱的那种~~~穷人,就剩这点脾气了
接下来就开始干活了
IDA打开文件,F5一下,进入main:(菜鸟的自我修养,F5)
看到有success,这个应该就是关键了,要输出success需要满足第一个if(图中1)为假,else里嵌套的第一个if(图中2)为真,小白也不会玩,看到success就直接进入了if ( Sudu::check((Sudu *)&v14) )这个语句,双击跟进这个函数:(这里用血的教训证明了,按部就班的从第一个条件看着走不好吗,啊?)
要返回为真,这里的三个函数的返回值均需要为真,好吧,那就一个个的看,我能怎么办呢,我也不想看,第一个check_block,这里需要注意传入的参数为一个指针的int类型:
这段代码需要结合题目是数独来分析(当然,要是你先看的第一个条件就会好理解很多了),看了老久(我会告诉你我是从大佬的文章里知道的吗,菜鸟不要面子的吗),确认他是对给的数独进行分析,如果满足数独对块的要求,就是每个小的3*3块都是1到9不同的数字,返回值为1,就这样看其实很头疼(大佬没说为什么。。。就只好自己看了。。。),给出自己的分析过程,希望有用:
首先注意这三个地方,第一处,将v2里的值全置为1(除了v2[0],后一样,不用0-8而用1-9是因为1-9刚好是数独可以填的数字),中间将v2里的某几个值置为0(暂且这样说吧),然后最后又对v2的所有值进行判断,如果全部置为0了,return 1,而这是我们要的,否则 return 0,也就是,只要 *(_DWORD *)(a1 + 4 * (v3 + 9 * v4)) 的值为1