前言:这题与前面不同。flag不在输入输出中,甚至不在main函数中,就是藏在一个隐秘的角落!
一.[2019红帽杯]easyRE
首先就是查到了upx壳然后在kali中脱壳,之后用IDA64打开静态分析
进入之后发现没有找到main函数,是start(这里我突然想到之前见过这种start开始的题,于是我找到了那一题打开的界面,和这题基本一样)按F5反编译
反编译后我发现,除了第一个参数的函数以外,其他函数除了名字不一样,里面的内容都是一样的,我去查了很多,得到的结论是:在C++语言中,main函数之前会有一个start的开始处理,会调用栈、堆等等预处理,反正这里理解其他函数都是预处理函数就行,有效函数就是第一个参数的函数,我们把它当做main函数
双击进入主函数:(当然这题也可以Shift+F12锁定主函数,但是原理该懂的还是要去搞明白)阅读程序
起始的这个空间申请就不再赘述,开头结尾可以对上验证
最后的“You found me!!!”肯定就是正确出口但是前面有个continue,先分析上面的代码吧,具体分析我写在图片中了,每一个参数的由来都解释的非常清楚,逆向学习7分靠猜,知道大概当然也能推理,但是我更倾向于练习的时候抽丝剥茧
这就可以推出v15也就是第一次输入
脚本:
python">v17[1] = 111
v17[2] = 100
v17[3] = 108
v17[4] = 62
v17[5] = 81
v17[6] = 110
v17[7] = 98
v17[8] = 40
v17[9] = 111
v17[10] = 99
v17[11] = 121
v17[12] = 127
v17[13] = 121
v17[14] = 46
v17[15] = 105
v17[16] = 127
v17[17] = 100
v17[18] = 96
v17[19] = 51
v17[20] = 119
v17[21] = 125
v17[22] = 119
v17[23] = 101
v17[24] = 107
v17[25] = 57
v17[26] = 123
v17[27] = 105
v17[28] = 121
v17[29] = 61
v17[30] = 126
v17[31] = 121
v17[32] = 76
v17[33] = 64
v17[34] = 69
v17[35] = 67
flag=""
for i in range(36):flag+=chr(v17[i]^i)
print(flag)
得到字符串
python">Info:The first four chars are `flag`
信息而已,说前4个字符是flag,不知道能干嘛,继续往下分析
就是再次对输入的v18进行base64加密处理10次处理后与已知明文验证,通过则输出正确
补充:这可以看出来是base64加密,密钥都给了
补充:双击off_6CC090发现是常量,再追踪发现就是base64加密后的字符串
接着解密10次得到一个网址
python">https://bbs.pediy.com/thread-254172.htm
点进去是说主动防御的,没找到flag线索啊
到这里,懵逼了
后来知道,在off_6CC090之下有一段发现了没用到的数据
追踪发现函数sub_400D35,具体程序逻辑如图(看不懂的先不用管,后面会讲是什么)
知道v1第1位字符和最后1个字符经过异或运算后分别为f和g
结合第一段程序可以知道4个字符就是flag那么就可以反推出v1即密钥,然后就可以由明文推出所有异或的字符即flag
上脚本:
python">enc = [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]
key = ""
flag = ""
en = "flag"
for i in range(4):key+=chr(enc[i]^ord(en[i]))
print(key)
for j in range(len(enc)):flag+=chr(enc[j]^ord(key[j%4]))
print(flag)
key为**&YA1**
flag为flag{Act1ve_Defen5e_Test}
补充:为什么flag藏在一个只能靠数据追踪的函数中不在main函数中?对最后的函数追踪一下,Ctrl+X键,发现在.fini_array段才调用此函数,.fini_array是正序正常退出后才执行的函数,用来清空栈等调用的资源,这也与前面的start对应上了一个在前一个在后,原来这里也能藏flag
总结:这题让我知道了flag不只会在main函数中,也了解到了start和最后fini的处理方式,这些开始和结束的段也可以作为出题的地方,在以后没有main 的题中也能更清晰的分析 。