(祥云杯)reverse-re1

一.解题过程

Exeinfo查壳:
在这里插入图片描述

Linux 64位elf,未加壳,复制到虚拟机里运行一下:
在这里插入图片描述

随便输入一串字符串,直接退出,猜测应该是输入flag然后加密后比对的套路,开始ida分析:

在这里插入图片描述

输入字符串存储到v4中,不过这里注意的是v4,v5到v10全都用来存储输入字符串了,v10应该是最后一个字符,if条件的意思是保证输入是flag{xxxx},(f的ascii码是102, l的ascii码是108,以此类推 )即flag{xxx}中间的类容就是v9,长度为32。Sub_5611FF380就是检查v9了,点进去看看。

在这里插入图片描述

好家伙,函数太长了,第一次遇到这种情况

直接看看汇编代码:
在这里插入图片描述

这里大概就是对字符串加密的地方了,先变换再把变换后的字符存回原处,这样的操作下面还有一大堆,数都数不完,我就截一个示例以下,这种加密最后应该有一个cmp的地方。
先打开string window看一下
在这里插入图片描述

看到一个win! 点进去瞧瞧

在这里插入图片描述

Ctrl + x一下:

在这里插入图片描述

找到地方了,可惜这个地方比较的都是立即数,dump不出来,只能一个个ctrl+c, ctrl+v了。这里想要根据加密步骤解密是不可能的的了,不过这个加密过程上下文无关(前面字符的加密不影响当前字符的加密),flag常用的字符也就是0-9 a-z A-Z,就先输入32个字符进去瞧瞧,动态调试一下,做个hash表来逆向。
在这里插入图片描述

在这里插入图片描述

0-9加密成0xe8-0xf1, a-z是从0x19开始加密,算下差值:
在这里插入图片描述

在这里插入图片描述

184 + 72刚好为256,所以猜测整体的加密过程应该为0-255之内的字符均向右循环移位184(或者循环左移72)。把最后cmp用到的32个数抠出来,循环左移184位,加上flag{},提交以下,成功。

flag{39a0ff847f1f4404aa6c7742d20363e9}

二.解题脚本

nums = [0xEB, 0xF1, 0x19, 0xE8, 0x1e, 0x1e, 0xf0, 0xec,
        0xef, 0x1e, 0xe9, 0x1e, 0xec, 0xec, 0xe8, 0xec,
        0x19, 0x19, 0xee, 0x1b, 0xef, 0xef, 0xec, 0xea,
        0x1c, 0xea, 0xe8, 0xeb, 0xee, 0xeb, 0x1d, 0xf1]

flags = 'flag{' + ''.join([chr((n - 184) & 0xFF) for n in nums]) + '}'
print(flags)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值