SimpleRev

SimpleRev

拖入 ida 64,程序并不复杂,直接 F5 反编译就看到主要的流程

img

发现主要的处理是在 Decry() 函数中,直接点进去,如下图(图1)

img

为了便于理解,转换了一部分之后如下图(图2),接下来进行分析

img

可以看到主要操作如下:
(1)将字符串 key3 和变量 v9 进行 join() 操作,赋值给变量 text,其中 key3 的值为 kills,点进去 join() 函数发现实质也是 strcpy() 加上 strcat() 的使用
(2)将 key1 的值复制给 key,再使用 strcat() 将变量 src 的值和 key 进行连接,其中 key1 的值为 ADSFK

strcat() 函数原型:
char *strcat( char * destination, const char * source );
作用:
把 strSource 所指向的字符串追加到 strDestination 所指向的字符串的结尾。strDestination 末尾的 \0会被覆盖,strSource 末尾的 \0会一起被复制过去,最终的字符串只有一个 \0

阿斯克码表

(3)for 循环,对 key 进行处理,将 key 中的大写字母都转换成小写字母
(4)while 循环,对输入的字符进行处理,具体是将字符依次读到变量 v1 中,然后判断是否是大写字符或者小写字符,但是处理操作都一样,都是 str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97;,一系列操作之后依次赋值给变量 str2
(5)最后将变量 text 和 str2 进行对比,一致的话输出 Congratulation!

注意:在图二中看到的变量 src 和变量 v9,分别是 SLCDNwodah,但是其实有一定的坑。
个人理解是,在图一中,可以看到变量 src 和变量 v9,都是 int64 数据类型。我们用 ida 时候,ida 给我们显示的是大端序,但其实 int64 数据类型存储时候是按照小端序的,因此进行字符串拼接操作也需要按照小端序进行。
因此变量 src 和变量 v9,实质上分别是 NDCLShadow,拼接得到的变量 key 为 ADSFKNDCLS,变量 text 为 killshadow

因为涉及到 %26 的运算,为了方便我们直接进行爆破,遍历字母 a - z,经过加密后的值与 text 对比,最终求得原来的输入的值

key = 'ADSFKNDCLS'
text = 'killshadow'
key_new = ''
for i in range(0, len(key)): # 将 key 转换成小写
    key_new += chr(ord(key[i]) + 32)
flag = ''
for i in range(10):
    for j in range(65, 123):
        if j > 90 and j < 97:
            continue
        else: # 遍历 A-Z 和 a-z
            if chr((j - 39 - ord(key_new[i]) + 97) % 26 + 97) == text[i]:
                flag += chr(j)
                break
print(flag)

理论上这个脚本最后的 break 是不需要的,因为 flag 有 10 位,其中原来的程序对于每一位的操作,都是不区分大小写的,就是说每一位都有大写和小写两种答案,即总共有 2^10 个答案。这里使用 break 之后,每个位置就是全都是大写的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值