buuctf [2019红帽杯]easyRE

查壳

64位无壳,拖入IDA

全是这种函数,无main函数,有一个start函数但没什么用,打开字符串子视图看看有没有什么信息

前五个比较重要,跟进到唯一一个引用函数

分析一下第一阶段,就是输入一个长度为36的字符串,这里IDA的识别有点问题,v12、v13和v14应该是连在一起的一个数组,不然下面的if判断条件中v12数组会越界

写个脚本看一下v15里的是什么内容

1
2
3
4
5
6
7
v12="Iodl>Qnb(ocy\x7Fy.i\x7Fd`3w}wek9{iy=~yL@EC"
v15=''
j=0
for i in v12:
v15+=chr(ord(i)^j)
j+=1
print(v15)

输出结果是 Info:The first four chars are `flag`,没什么用...

往下分析

输入的字符串进行10次函数运算后得到的结果与off_6CC090处字符进行比较

查看sub_400E44函数与off_6CC090内容

正常的base64表,其实刚才看字符串视图就已经看到了

这里就是加密后的字符串,解密十次得到

https://bbs.kanxue.com/thread-254172-3.htm

又被骗了...

其实真正的有效信息在off_6CC090下方,跟进引用函数

这里可以看到flag初具雏形,不用管上面的1234次循环,直接根据byte_6CC0A0处的内容可以得到v1和v4,这里unsigned_int8HIBYTE是把低八位和高八位取出来,分别是f和g,可以合理猜测整个就是flag

脚本

1
2
3
4
5
6
7
8
a=[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]
b=['f','l','a','g']
c=''
for i in range(4):
b[i]=chr(ord(b[i])^a[i])
for i in range(25):
c+=chr(a[i]^ord(b[i%4]))
print(c)

得到flag

虽然这题当时好像只是一道签到,但很搞的是被骗了两次...