buuctf re easyRE

题目脚本来说并不算难写,代码也不是很难看懂,但就是莫名其妙花的时间有点多。
img
下载文件打开找到main函数:
img
看到如上的逻辑,这里分析代码之后发现,这里的一个我定义名字位scanf的函数其实不止包含一个输入字符串的作用,还会返还该字符串的长度。
img
看到函数的这一部分:首先是字符串必须是在36的长度,然后就是字符串异或i之后跟12字符串中的结果得相同,这里我们看回v12
img
这里可以看到v12在伪代码中就16的长度,远远不符合代码正常运行的结果,然后要记住这是反汇编和IDA的伪代码,所以IDA的伪代码是可能出错的,然后看到v12+v13的长度,这两个在空间中相近,并且17+19刚好是36,所以我们猜测这里是IDA错误,实际上v12代表的是这两段字符串的长度。
这里由于没有其它更多的提示了,所以进行爆破:

enc='Iodl>Qnb(ocy\x7Fy.i\x7Fd`3w}wek9{iy=~yL@EC'
flag=''
for i in range(36):
    for key in range(32,128):
        if key ^ i == ord(enc[i]) :
            flag+=chr(key)
print(flag)

img
写出脚本爆破后的结果如上,提示我们字符串的前面四个字是flag。
img
到汇编区的如上位置的时候,上面提供了一段base64编码,下面提供了一段字符串,base64解码得到一段网址,这个只是干扰项,没有任何用处。
然后回到我们的IDA中看到base64编码字符串的下面一段字符串,通过ctrl+x的索引到其杯调用的函数里面去看看。
img
进行分析,可以猜测到这大概就是进行flag加密和验证的地方了,这里通过HIBYTE从而取到我们的数组的后面一个字节,然后可以看到下面的把刚刚看到的第一个字符串跟这里面存在v1和v4(v4就是v1)中的数组进行循环异或操作,通过mod4的操作构成循环。
这里分析不出v1里面的值具体是多少,因为上面的函数太过复杂了,因为这里v1就只有4位,然后刚刚提示我们说flag前缀是flag,这样我们通过flag跟加密字符串的前面四个数值进行异或就可以得到v1的值了。

data=[ 0x40, 0x35, 0x20, 0x56, 0x5D, 0x18, 0x22, 0x45, 0x17, 0x2F,
  0x24, 0x6E, 0x62, 0x3C, 0x27, 0x54, 0x48, 0x6C, 0x24, 0x6E,
  0x72, 0x3C, 0x32, 0x45, 0x5B]
r='flag'
v1=[]
for i in range(len(r)):
    v1.append(ord(r[i])^data[i])
for i in range(len(data)):
    print(chr(data[i]^v1[i%4]),end='')
#flag{Act1ve_Defen5e_Test}

从而得到了flag的值

posted @ 2025-04-21 19:42  喵老师哒哟  阅读(51)  评论(0)    收藏  举报