CTFshow—武穆遗书

发布时间 2023-07-21 11:18:48作者: h40vv3n

武穆遗书

将exe文件放入exeinfo查看该执行文件被加了upx壳

image-20230609135243529

使用upx命令成功脱壳

image-20230609141855272

先初步运行该执行文件,发现需要用户输入,随意输入之后发现显示失败,因此判断该题的类型为当用户输入满足一定条件时会显示flag或者此时用户的输入就是flag

image-20230609142218269

使用ida打开该执行文件进行初步的静态分析,此时发现将用户的输入存入v6中与v4中的值进行比较,若相等则跳出循环,并提示此时的flag就是用户的输入,因此,此题的关键是想办法得到v4的值

image-20230609142906006

查看与v4变量有关的函数进行进一步分析,发现这之中还有几个函数,逐个点进去查看后发现非常复杂,想要通过静态分析写出解题脚本解出flag的难度较大,因此决定通过动态调式的方式,在程序运行时得出v4的值之后再去查看变量的值应该可以得到flag

image-20230609143431181

在循环的入口处打上断点进行动态调试,但是发现程序闪了一下之后直接就结束了

image-20230609143602293

此时发现在进入循环之前还有几个函数,猜测原因出在这里,依次点进去查看,发现有一个退出当前进程的操作,而判断的条件则为是否是处于调试状态,因此程序才会闪一下就退出。

image-20230609143805830

image-20230609143813219

所以此刻我们需要让判断条件为假时就不会退出当前进程,因此我们先在判断条件处打上断点,并开启调试,从断点处按F8进行单步调试

image-20230609144612446

image-20230609144622351

此时我们可以在汇编语言界面这里看到程序每一步的执行情况,继续按F8运行到第一个分叉点,此时发现程序继续往下的话会进入到左边的分支,也就是会结束当前进程,所以此时我们更改ZF标志位的值,这样的话jz指令就会跳到右边的分支

image-20230609145045848

执行到第二个分叉点,我们进行同样的操作,更改ZF标志位使得jnz指令跳到右边的分支

image-20230609150404699

F9执行到下一个断点处,也就是循环开始的地方,但是此时程序又直接退出了,此时判断程序中仍然存在退出进程的代码并且在调试的时候执行了,我们此时查看第二个函数sub_401200,发现的确有一个退出的函数exit(0),我们在上一行的判断条件处打上断点,再次进行动态调试

image-20230609150852636

运行到分叉点处发现若是继续执行程序的确会跳转到左边执行退出代码,因此我们此时仍然选择更改ZF标志位,使得程序跳转到右边的分支

image-20230609151330781

成功绕过退出代码后按F9跳到循环开始的地方,但是此时ida却报错了,错误内容显示在0x401293地址处的值存在问题,因此我们进入第三个函数sub_401280()进一步分析

image-20230609151837704

点击函数sub_401280()中发现确实存在两行异常代码,此时我们在第三行打上断点进行动态调试

image-20230609151920617

image-20230609152103240

运行到目标断点处发现了这两行异常代码所对应的汇编指令

image-20230609152343061

此时我们在这三行异常汇编指令上点击鼠标右键,然后将这三条指令nop掉,这样程序就不会执行异常的代码,若是还是报相似的错误,则在报错的地址处将其nop

image-20230609152646430image-20230609153802935

F9发现还是报错了,但此时的错误与刚才不同,点击确认后会跳转到报错的地址处

image-20230609153951301

image-20230609153958475

我们将这行指令nop掉,继续向下执行,按F9,发现此时没有报错,且控制台提示用户进行输入,我们随意输入后按回车,然后按F9,此时发现控制台再次提示用户进行输入

image-20230609154619016

此时判断程序执行过一次循环了,而此时查看变量v4应该就能获取到flag了,若是v4此时看不到flag,我们就继续执行循环,通过F8单步执行并且查看每一步执行后寄存器的的值,最终也是找到flag

image-20230609160406075

flag{fmf_is_great!}