<一> level1
1.拖入exeinfo查壳,无壳,64位PE文件,用ida64打开。
2.检查文件,shift+F12找到字符串窗口,观察点击有用字符串,按ctrl+x打开调用函数,跟进并点击F5或tap查看C代码。
3.主要部分如下:意思是输入的str1与str2比较相同则成功输出语句,否则失败并退出,在此可以判断str2的内容很有可能就是fake_flag(改造后的flag,之前if语句做了修改)。重点是上面条件语句,意思为str2的字符若为o(ASCⅡ代码为111)则将其替换为0(ASCⅡ代码为48)。
4.双击str2,将o改为0即为flag。
<二> level2
1.检查文件有壳脱壳,一些软件好像用不了,只知道是32位文件,直接用虚拟机脱。
2.这里脱完没有产生脱壳后的文件,将源文件再移动回本机上,用ida打开。
3.双击flag,只要脱壳就成功了。
<三> level3
1.检查文件64位无壳,ida打开。进入main函数按F5得到C代码。
2.发现是base64编码,按shift+F12找到编码数据,双击进入汇编窗口。
但是上面提示语句说了“different from the standard base64”和标准64编码有出入,那么选中按ctrl+x找找调用函数有对它修改了什么。
可以看到除了encode部分定义base64,还有O_OLookAtYou对其做了修改。意思就是前20个字符中前十个和后十个调换顺序,对其逆向操作可得到改造后的编码。
3.编写脚本如下:
import base64
plaintext = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
plaintext = list(plaintext) #列表对其遍历交换值
cipher ='d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9yZXZlcnGlfD=='
flag = []
for i in range(10):
a = plaintext[i]
plaintext[i] = plaintext[19 - i]
plaintext[19 - i] = a #得到改造后的plaintext
base64_string ="".join(plaintext)
print(base64_string)
plaintext = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' #列表适应不了maketrans所以再次转为字符串
flag.append(base64.b64decode(cipher.translate(str.maketrans(base64_string,plaintext)))) #需要记住理解
print(flag)