re新手cut题

拿到题目,发现这不是一个可以执行的exe文件(但是可以拖到虚拟机里面查看文件,会发现,是下面这样子的!还要感谢某位同学指出了我的错误qwq现在下面补上的图也是在他的博客上截屏来的)

嗯,看样子是需要我们输入一个正确的flag,于是果断把它拖进IDA看一下(64位)。进入main函数,按F5查看伪代码。

首先,v8是我们输入的flag(也就是正确的flag,我们现在还并不知道),然后有个_substr666函数,又与我们输入的v8有关,点进去看一下。

然后发现,a3其实是开始循环的i下标,而a4则是for语句循环的次数,又由于a2是传值调用v8,所以可以知道,其实是把v8(也就是flag)的前六位存到了a1(即v9里面去)。

同理可以知道,主函数中后面的两条语句分别是将v8(也就是flag)的最后6位存到了v12中,而v8中间(即第七位)则是存到了v15里面。

再继续看回主函数,最下面有一个判断,if(v4)则代表我们输入的flag是正确的。再看往上看一下,如果要是v4=1,则要满足三个if语句。

不要着急,我们一个一个来看,先点进去看0x233333这个函数,由于传的参数是V9,即是对flag的前六位进行处理。

阅读代码,发现又用到了substr666这个函数,也就是把str里面的第八位开始,for语句循环六次,存6个字符到s2里面。接着对传进来的V9也就是flag的前六位(注意,是前六位!)进行异或加密,然后存到s1中,再对比s1和s2,如果相等就传回1。

这个str我们之前没有遇到过,所以点进去看一下,发现是一串字符串。

然后从第八个开始数6个字符,得到“Ngemkt”,这个就是我们flag前六位加密后得到的啦,这时候,我们写个程序,跑一下,就能得到"Hacker",

返回主函数,继续看下面的函数0x666666,发现是对v12(即flag的后六位进行处理)。

同样用了substr666函数讲str的前六位存到了s中,然后与加密后的flag后六位对比,如果相同,就返回1。同样, 写个程序跑一下,得到flag的后六位。

再继续看,现在我们只剩下flag的第七位还没有了,于是我们点进去最后一个函数0x8048000,发现这个比较简单,就是告诉我们,传进去的参数也就是v15flag的第七位是"_"。

综上把我们得到的部分flag拼凑一下,应该是:Hacker_world!

 

posted on 2019-03-16 22:26  香辣鸡腿  阅读(106)  评论(0编辑  收藏  举报

导航