XCTF--(新手赛区)第4题快来围观学习!

1.先查抄题目,根据做家的话说是需求逆向算法了,先下载上去吧图片 1.png1.先查抄题目。根据做者的话来说,就是需求的逆向算法。先下载它

2.下载上去先查壳图片 2.png2.下载前查抄外壳

下载上去是个64位没加壳的二进造文献3.常例子,先丢进kali运转一下看看挨次流程图片 3.png下载的是不带shell的64位二进造文档3。常例子,先把它扔进kali,运行它看序列流

运转了一下创造挨次流程即是让用户输出料想的,一句料想的后果停行输入提醒4.既然多么咱们就间接把文献丢进ida平阐发,先shift+F12查抄援用字符图片 4.png运行创造序列流程后,用户能够输出推测,推测的后果停行输入提醒4。在那种情况下,我们将间接把文献扔进ida flat阐发,并起首shift+F12查抄引用的字符

好家伙,创造关头提醒字符,根据字面意义即是说用户输出的flag是切确的,那咱们间接跟出来5.跟进来看到welcom关头字符本钱,那没有即是二进造刚运转的时分表示的用户提醒吗?那咱们间接查抄进入援用函数图片 5.png好家伙,批判提醒字符的创造,字面意思就是用户输出的标记是准确的,那我们就间接跟着它走吧5。走进来,看看welcom批判性格之都。那不就是二进造刚运行时的用户提醒吗?让我们间接查抄拜候函数

6.进入函数F5查抄伪代码,查抄挨次逻辑图片 6.png6.输入函数F5查抄伪代码并查抄时序逻辑

①把一串字符赋值给v8②把一串十六进造数赋值给v7,7赋值给v6③将用户输出字符赋值给s,并将其长度赋值给v3④起首对照输出字符的长度能否小于v8的长度,假设小于履行,sub_4007C0()函数,跟进那个函数创造是提醒输出过错的⑤for轮回即是关头,轮回中第一个if便是判别用户输出的字符长度能否年夜于v8的长度假设年夜于,那末就履行sub_4007C0(),跟进创造即是提醒flag过错的讯息,第二个if便是对照用户 输出的每一个字符能否便是 (char)(((BYTE )&v7 + i % v6) ^ v8[i]),假设没有便是履行sub_4007C0(),跟进创造也是提醒flag过错,创造另有最后 一行代码函数有跟出来看过,跟出来看即是提醒 flag切确,那如何本领履行他呢?必然是轮回成功履行完当前那咱们即可念而知,只需咱们输出的每逐个个字符s[i] != (char)(((BYTE )&v7 + i % v6) ^ v8[i])则就可以 履行完轮回,也即是说咱们输出的flag是切确的,能失掉提醒消息。⑥if ( s[i] != (char)(((_BYTE )&v7 + i % v6) ^ v8[i]) )是相比加密后的flag,那咱们逆运算加密后的flag即能够失掉实在的flag了,因为源码中的flag加密是采用异或者,但是异或者的逆运算任然是异或者逆运算代码以下:图片 7.png①将一串字符赋给v8②将一串十六进造数字赋给v7,将7赋给v6③将用户输出字符赋给S,将其长度赋给v3④查抄第一个输出字符的长度能否小于v8的长度,若是小于性能,sub_4007C0()函数,是为了提醒输出而创造的。轮回中第一个if是判断用户输出的字符长度能否大于v8。若是大于V8,那么将施行sub_4007C0(),后续创造将是一个动静,提醒flag其毛病。第二个if是用户输出的每一个字符能否都能够是(char) ((byte) & V7+I% V6) V8 [I]),若是不是,sub_4007C0()将被满足,而且跟从进入本创造也会提醒flag它的错误。此外,本创造的第一行代码函数已被遵照,遵照它将提醒标记是准确的。怎么才气实现呢?必然是转世胜利了。然后我们就能够读了,我们输出的每一个只需要一个字符s[i]!=(char)(((BYTE)& amp;V7+I% V6) V8 [I])就能完成轮回,也就是说我们输出的标记是准确的,提醒信息能够丧失。⑥if ( s[i]!=(char)(((_ BYTE)& amp;V7+I% V6) V8 [I])与加密标记停止比力,因而我们能够通过加密标记的逆运算来丧失实在标记。因为源代码中的标记加密接纳异或,但是异或的逆运算仍然是异或逆运算代码如下:

7.后果:图片 8.png7.后果:

您可以还会对下面的文章感兴趣:

最新评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。