逆向BUUlevel1~3解题

<一> 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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值