BugKu逆向---love---WP

首先运行一下程序,随便输入一个字符串,看下返回结果,提示"wrong flag!"

然后查一下壳

BugKu逆向---love---WP_第1张图片

没有壳,是C++写的程序,用OD打开调试一下。加载进去发现和以前载入的入口地址不一样,别慌,先搜索一下ASCII,能搜到之前给出的提示"wrong flag"

BugKu逆向---love---WP_第2张图片

跟过去看看

BugKu逆向---love---WP_第3张图片

发现在字符串"wrong flag"上面有一个判断语句,左边有个跳转的小三角,选中他,能看到跳转到下面"right flag",再往上看,有一个strncmp函数,我们在这两个地方下断点(快捷键F2),然后重新运行。为了方便我们分析,这次输入"AAAAAAAA", 在第一个断点处我们看栈中函数strncmp的三个参数,并没有我们输入的内容,所以中间程序将我们的输入进行了处理。

我们多尝试一下其他输入,发现,s1是变的,但是s2是固定的,所以说程序将我们的输入进行变换后和 "e3nifIH9b_C@n@dH"进行比较。我们先不管他,单步往下走。

BugKu逆向---love---WP_第4张图片

执行到判断语句时,下面给出了跳转未实现,这里我们将je改为jmp或者jne,将这个跳转实现,看看会返回什么结果,结果只返回了"right flag"的提示,并没有给出其他的东西。那么这里思考一下,他一开始提示"please enter the flag",返回的结果只有两种,一个是错误,一个是正确,而且每次都和"e3nifIH9b_C@n@dH"这个字符串进行比较,是不是意味着"e3nifIH9b_C@n@dH"就是flag进行了一下加密变换。

我们将程序用IDA打开分析一下,也是一进去,函数窗口的函数名称没分析出来,连main()函数都没有,不要怕,还是从字符串入手,Shift+F12查看字符串

BugKu逆向---love---WP_第5张图片

我们不仅发现了之前的"wrong flag"而且还有一个"base64input",我们先不管这个"base64input",找到"wrong flag"出现的位置,先双击这个字符串,然后按x找到引用他的地方。

BugKu逆向---love---WP_第6张图片

我们可以通过汇编代码看一下他调用了哪些函数,然后F5查看伪代码

BugKu逆向---love---WP_第7张图片

乍一看,这个函数挺复杂,还都是一些未识别的函数,让人觉得很难,别急,找到一开始提示你输入flag的地方,从那开始看,下面的函数应该就是scanf()函数,他将你的输入传入了sub_4110BE()函数进行了处理,我们先不管他怎么处理的,往下看,将处理后的字符串复制到Dest变量,然后将Dest的每一位都加上那个字符对于在字符串的索引,将得到的字符串与'e3nifIH9b_C@n@dH'进行比较。

还记得查看字符串的时候出现了base64吗,我们要对这些字符串敏感一些,那么猜测一下,这个程序将我们的字符串进行base64加密,然后每一位加上对应的索引,再转换为字符串,再与’e3nifIH9b_C@n@dH’进行比较。那么我们需要将'e3nifIH9b_C@n@dH'每一位字符先转换为对应的ascill码,减去对应的索引值,再转换为字符串进行base64解码。写个小脚本跑一下试试,将得到的值加个flag的头提交上去,发现这就是我们要找的flag。

BugKu逆向---love---WP_第8张图片

由于我没有深入了解过base64的加密过程,所以我只能到之前字符串的提示来猜测是用了base64,在之前字符串的那个图上,你可以看到字符串"please enter the flag"的上面有字符串"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",这正好是base64所用到的字符范围,也是对你的一种提示,如果你对base64加密过程了解,你跟进去sub_4110BE()函数(也就是第一次处理的函数),可以看出来是base64算法的。下面是解题脚本源码。

import base64
s = "e3nifIH9b_C@n@dH"
f = ''
n = len(s)
for i in range(n):
    f += chr(ord(s[i]) - i)
print (f)
print(base64.b64decode(f))

你可能感兴趣的:(Reverse)