BUUCTF-SimpleRev

BUUCTF-SimpleRev.md

查壳

linux64位,无壳,LE小端序储存

image-20241031220848503

进入 Decry()分析

image-20241031221213216

这种题直接寻找if判断条件

image-20241031223951070

可以看到比较了textstr2

但二者点进去都没赋值

先观察 text

text = join(key3, v9);

将key3和v9变量拼接起来

v9 : image-20241031224248344

key3:image-20241031224325550

由于v9这里是大端序展示,所以我们在拼接的时候得转换成小端序

则 text = 'killshadow'

接着是str2

image-20241031224552352

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进行赋值

image-20241031225741760

先用strcpy将key1赋值给key

然后用strcat将src拼接到key后面

key1 = image-20241031225850254

src = image-20241031230017675

同样,要将src换成小端序

所以 key = 'ADSFKNDCLS'

接着,对key进行for循环,对key进行加密

image-20241031230421075

但其实就是将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

当然如果想逆向也可以,只是没有爆破那么简单无脑

posted @ 2024-10-31 23:22  结城希亚  阅读(13)  评论(0编辑  收藏  举报