CTF学习-逆向解题思路
CTF学习-逆向解题思路
通过file命令查看文件类型,判断是ELF还是PE,32位还是64位。
通过strings并重定向标准输出,然后搜索大括号 { ,看看是否能直接得到flag.
将程序运行一下,心里有个数。
通过ExeinfoPe查壳,如果有壳,通过upx -d [ 文件名 ] 去壳。
通过各种工具将文件反汇编+反编译(如果比较刚猛,也可以直接看二进制指令)
阅读代码,判断题型。
TIPS:
如果反编译后函数特别少,可能是因为加了壳。
如果反编译后找不到main函数,先通过CTRL+F搜一下,搜不到就说明函数名被隐藏了,这时候跑一下程序,然后看一下程序开始时的那串提示信息,在IDA中CTRL+S切换到rodata段,找到这个字符串,然后看它是在哪里被调用的即可找到main
一般而言,Java和Python的题会简单一点,因为反编译后的代码可读性更强。
二、手动破解
题型识别:要求你输入一个字符串,然后程序把你输入的字符串加密,再把加密后的字符串和存储在程序里的密文对比。显然你输入的即为flag,你需要根据密文和加密过程,反向推出flag.
自己写个脚本,根据加密算法进行解密即可。
请注意,当加密算法很复杂时,可能是用的某种加密算法。这时候应该善用搜索引擎去搜索现成的解密算法。
三、迷宫问题
题型识别:最大的特征是存在4组判断,分别对应上下左右的移动操作,以及一个合法性检测,判断你是否撞墙。
解题方法很简单,找到迷宫字符串,它可能二维可能一维,但在C中必然是以一维形式存储,把它转换回二维迷宫。然后从起点走到终点的操作序列即为最终的flag.
有一个潜在的难点在于如何记录横纵坐标。现在见过的几个操作是
开两个数组/两个变量,分别对应横纵坐标。
用1个8字节的变量,高低4位分别记录横纵坐标。(此时反汇编代码中可能会存在类似于LOWBYTE、HIBYTE这种)参考博客
四、手动绕开
题型识别:程序会主动输出flag,但是输出的是密文,程序内置了解密函数,但是这个函数不会被执行,此时可以尝试根据解密函数,自己手动破解,但是更好的做法是修改源代码。
IDA中修改完源码记得要保存到源程序,否则不生效。
修改源代码,往往是汇编代码,不可随意更改,应该保证对应的机器指令占的字节数不发现改变,可以减少,然后通过nop填充,但一般不可增多,因为会影响到后面代码的地址,从而影响到整个程序。
常用汇编命令与其机器指令:
je、jne、jmp系列、nop、xor等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2019-08-27 大数据基础总结---HDFS分布式文件系统