[GUET-CTF2019]number_game-buu刷题记录4

本文详细介绍了如何利用IDA64静态分析及动态调试技术解决一个涉及递归和数独验证的编程挑战。首先通过查壳和IDA分析找到关键函数,然后通过动态调试追踪输入到数独序列的变换过程,最终成功还原正确顺序并输出解决方案。整个过程中,作者展示了逆向工程在解决这类问题时的有效性。
摘要由CSDN通过智能技术生成

0x00 查壳

上来先查壳,无壳。并且可以看到是ELF文件,这里就直接用IDA64打开就好。

1

0x01 IDA分析

打开之后可以看到main函数,直接转过去分析:

image-20210413103313451

这里的逻辑清晰可见,v5就是我们的输入,只要函数sub_400917返回真值,if条件语句成立即可输出flag。所以我们转到函数里面分析:

image-20210413104256838

一个数独游戏,这里的两个if语句则是判断行和列有无重复值,数独的数据则保存在unk_601060里面,所以根据这个规则直接把它解出来,得到一个数列。然后返回main函数继续分析,依次向上分析函数,发现sub_400881实现了v7往unk_601060里面赋值的操作,赋值的位置恰好是空的位置(既 ‘#’ 号的位置)

image-20210413125919530

所以继续往上看,就看到v7来自v3,v3来自v5,两次都是递归算法(两张拼在一起):

image-20210413130549776

递归算法由于其空间复杂,不便于手动分析逆算。所以先放着,整体分析完最后解决。然后就是最上面的if语句里的函数,是对输入的v5的一个效验函数:

image-20210413131952594

效验函数很简单,先判断长度是否等于10,再判断每一个字符是否超出了0~4的范围。分析到这里,我们的基本思路以及捋清楚了。

image-20210413132250942

所以我们只需要解决两次递归变序的问题就好。硬分析不如动调来的简单,把文件甩进虚拟机,用ida直接动态调试,我们输入0123456789然后在sub_400881函数下断查看即可。这样就得到变序处理后的顺序,再还原回去就OK。

0x02 动态调试

在如图的地方的设置断点,然后在下面jz跳转的时候使起不跳转进入后面的两个递归函数即可。

image-20210413134817211

成功找到变序之后的数列:

image-20210413134559854

0x03 exp

最后一步就很简单了,可以直接手推回去或者写个exp。附上exp:

inputs = "0421421430"
listindex = [7,3,8,1,9,4,0,5,2,6]
F = [0]*10

for i in range(10):
    F[listindex[i]] = inputs[i]

flag = ''.join(F)
print(flag)
#1134240024

检验:

image-20210413135927574
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值