CTFshow—武穆遗书
武穆遗书
将exe文件放入exeinfo查看该执行文件被加了upx壳
使用upx命令成功脱壳
先初步运行该执行文件,发现需要用户输入,随意输入之后发现显示失败,因此判断该题的类型为当用户输入满足一定条件时会显示flag或者此时用户的输入就是flag
使用ida打开该执行文件进行初步的静态分析,此时发现将用户的输入存入v6中与v4中的值进行比较,若相等则跳出循环,并提示此时的flag就是用户的输入,因此,此题的关键是想办法得到v4的值
查看与v4变量有关的函数进行进一步分析,发现这之中还有几个函数,逐个点进去查看后发现非常复杂,想要通过静态分析写出解题脚本解出flag的难度较大,因此决定通过动态调式的方式,在程序运行时得出v4的值之后再去查看变量的值应该可以得到flag
在循环的入口处打上断点进行动态调试,但是发现程序闪了一下之后直接就结束了
此时发现在进入循环之前还有几个函数,猜测原因出在这里,依次点进去查看,发现有一个退出当前进程的操作,而判断的条件则为是否是处于调试状态,因此程序才会闪一下就退出。
所以此刻我们需要让判断条件为假时就不会退出当前进程,因此我们先在判断条件处打上断点,并开启调试,从断点处按F8进行单步调试
此时我们可以在汇编语言界面这里看到程序每一步的执行情况,继续按F8运行到第一个分叉点,此时发现程序继续往下的话会进入到左边的分支,也就是会结束当前进程,所以此时我们更改ZF标志位的值,这样的话jz指令就会跳到右边的分支
执行到第二个分叉点,我们进行同样的操作,更改ZF标志位使得jnz指令跳到右边的分支
按F9执行到下一个断点处,也就是循环开始的地方,但是此时程序又直接退出了,此时判断程序中仍然存在退出进程的代码并且在调试的时候执行了,我们此时查看第二个函数sub_401200,发现的确有一个退出的函数exit(0),我们在上一行的判断条件处打上断点,再次进行动态调试
运行到分叉点处发现若是继续执行程序的确会跳转到左边执行退出代码,因此我们此时仍然选择更改ZF标志位,使得程序跳转到右边的分支
成功绕过退出代码后按F9跳到循环开始的地方,但是此时ida却报错了,错误内容显示在0x401293地址处的值存在问题,因此我们进入第三个函数sub_401280()进一步分析
点击函数sub_401280()中发现确实存在两行异常代码,此时我们在第三行打上断点进行动态调试
运行到目标断点处发现了这两行异常代码所对应的汇编指令
此时我们在这三行异常汇编指令上点击鼠标右键,然后将这三条指令nop掉,这样程序就不会执行异常的代码,若是还是报相似的错误,则在报错的地址处将其nop掉
按F9发现还是报错了,但此时的错误与刚才不同,点击确认后会跳转到报错的地址处
我们将这行指令nop掉,继续向下执行,按F9,发现此时没有报错,且控制台提示用户进行输入,我们随意输入后按回车,然后按F9,此时发现控制台再次提示用户进行输入
此时判断程序执行过一次循环了,而此时查看变量v4应该就能获取到flag了,若是v4此时看不到flag,我们就继续执行循环,通过F8单步执行并且查看每一步执行后寄存器的的值,最终也是找到flag
flag{fmf_is_great!}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程