BUUCTF-SimpleRev
BUUCTF-SimpleRev.md
查壳
linux64位,无壳,LE小端序储存
进入 Decry()
分析
这种题直接寻找if判断条件
可以看到比较了text
和 str2
但二者点进去都没赋值
先观察 text
text = join(key3, v9);
将key3和v9变量拼接起来
v9 :
key3:
由于v9这里是大端序展示,所以我们在拼接的时候得转换成小端序
则 text = 'killshadow'
接着是str2
str2用这个if条件和while循环逐个赋值,当v1为10停止循环
可以看到,v1是我们的输入 v1 = getchar();
,总共十个字节长度
先用if判断v1的值,其实就是如果是大写(v1 > 64 && v1 <= 90
),就执行str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97;
如果是小写( v1 <= 96 || v1 > 122
,用了else来表示在这中间),也执行相同操作
(如果记不住ascii码,可以对判断的数字按R转换为ascii码来观察)
现在就是求key的值了
这里用两个函数对key进行赋值
先用strcpy将key1赋值给key
然后用strcat将src拼接到key后面
key1 =
src =
同样,要将src换成小端序
所以 key = 'ADSFKNDCLS'
接着,对key进行for循环,对key进行加密
但其实就是将key大写转小写,可以自己去用python将大写字母的ascii码加32转小写
所以key = 'adsfkndcls'
编写脚本
这里的加密逻辑很简单,因此我们可以用爆破脚本
text = 'killshadow'
key = 'adsfkndcls'
flag = ''
v5 = len(key)
for i in range(10): #输入十次字符,所以循环十次
for j in range(ord('A'), ord('z')+1): #将所有字母进行尝试,寻找可以使if判断成功的字符
str2 = (j -39 - ord(key[i % v5]) +97) % 26 + 97 #将原本的加密直接照搬过来,这里需要ord(key[i % v5])是因为python不能直接将字符串转成ascii码
if chr(str2) == text[i]: #将算出来的ascii码chr()转成ascii码与text内容比较
flag += chr(j)
break #这里的break作用是如果if判断成功了一次就结束这个内层循环,开始第二个外层循环,如果没有break会输出很多满足条件的别的字符
print(flag)
输出结果为KLDQCUDFZO
当然如果想逆向也可以,只是没有爆破那么简单无脑