[GUET-CTF2019]re

本文介绍了对一个Linux ELF文件的逆向工程分析过程,通过IDA静态分析,发现了关键的代码段,并揭示了解密字符串的方法。通过调整代码并执行,最终得出解密后的flag。文章详细展示了如何利用UPX脱壳,以及在IDA中修改函数名称和类型以方便理解,对于逆向分析和密码学解密提供了实用的技巧。
摘要由CSDN通过智能技术生成

在这里插入图片描述

1.查壳+脱壳

得到一个没有后缀的文件,拖进die里看一下,发现是upx压缩壳,直接用upx命令行工具进行解压缩就好
在这里插入图片描述
在这里插入图片描述
脱完壳后的文件再拖进die里分析,可知是linux平台的elf文件,直接放ida里分析
在这里插入图片描述

2.ida静态分析

在这里插入图片描述
看不到显眼的main函数,这时候shift + f12查看一下字符串,能看到很多有用的信息
在这里插入图片描述
查看这个字符串的交叉引用
在这里插入图片描述
来到反汇编界面后直接反编译,这应该就是这道题目的关键代码部分了
在这里插入图片描述
稍微修改一下几个一眼能看出作用的函数名,让分析更加便于理解一点
在这里插入图片描述
在这里插入图片描述
看到一个可疑的sub_4009AE函数,双击进入函数体看看
在这里插入图片描述
从中可以看出v4是一个数组,那就把v4的定义修改一下,把它改成变量名为key,长度为32的数组,操作如下(y修改变量类型,n修改变量名)
修改变量类型的时候会提醒覆盖到了下边的变量,确认即可
修改为key方便自己理解
操作完成后就变成了这样,是不是直观多了
在这里插入图片描述
sub_4009AE里有和key相关的处理过程,写脚本从中反推出key的值即可:)

//python
a = [166163712, 731332800, 357245568, 1074393000, 489211344, 518971936, 406741500, 294236496, 177305856, 650683500,
     298351053, 386348487, 438258597, 249527520, 445362764, 981182160, 174988800, 493042704, 257493600,
     767478780, 312840624, 1404511500, 316139670, 619005024, 372641472, 373693320, 498266640, 452465676,
     208422720, 515592000, 719890500]
b = [1629056, 6771600, 3682944, 10431000, 3977328, 5138336, 7532250, 5551632, 3409728, 13013670, 6088797,
     7884663, 8944053, 5198490, 4544518, 10115280, 3645600, 9667504, 5364450, 13464540, 5488432, 14479500,
     6451830, 6252576, 7763364, 7327320, 8741520, 8871876, 4086720, 9374400, 5759124]
z = []
for i in range(len(a)):
    z.append(chr(int(a[i]/b[i])))
    print(z[i], end='')

需要注意的是16号和17号元素顺序是倒过来的,在看伪代码的时候要注意到,同时还能发现key[6]是未知的
在这里插入图片描述
在网上看了别人的wp,得出以下的解决思路

//python
a = [166163712, 731332800, 357245568, 1074393000, 489211344, 518971936, 406741500, 294236496, 177305856, 650683500,
     298351053, 386348487, 438258597, 249527520, 445362764, 981182160, 174988800, 493042704, 257493600,
     767478780, 312840624, 1404511500, 316139670, 619005024, 372641472, 373693320, 498266640, 452465676,
     208422720, 515592000, 719890500]
b = [1629056, 6771600, 3682944, 10431000, 3977328, 5138336, 7532250, 5551632, 3409728, 13013670, 6088797,
     7884663, 8944053, 5198490, 4544518, 10115280, 3645600, 9667504, 5364450, 13464540, 5488432, 14479500,
     6451830, 6252576, 7763364, 7327320, 8741520, 8871876, 4086720, 9374400, 5759124]
z = []
for i in range(len(a)):
    z.append(chr(int(a[i]/b[i])))
    print(z[i], end='')
print()
for i in range(10):
    s = z[:]
    s.insert(6, str(i))
    print(''.join(s))

在这里插入图片描述

就是在6号元素的位置插入数字,一个一个去套
能得到flag{e165421110ba03099a1c039337}为正确答案

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chneft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值