ctf入门指南
ctf入门指南
链接:https://www.zhihu.com/question/23999930/answer/1227443512
2010年就开始搞逆向了,那时候是windows平台,这两年搞起android了。首先逆向是个困难的工作,需要理论,也需要实践。
理论方面,必须清楚的认识逆向的本质是什么。放到更大的环境下来看,逆向从来不是最终目的,最终目的一般是要实现某个东西。
广义上,逆向不仅仅是调试二进制可执行格式,反汇编,破解。逆向是心理模型的建立过程,以及模型实现的底层细节的定位过程。
从理论上看,你为了理解系统,你读代码,无论是源码还是汇编,甚至二进制机械指令,都是一个逆向过程,其结果就是建立了一个模糊的心理模型,用于理解系统的运作过程,然而系统代码是复杂的,庞大的,只凭脑力难以定位底层细节,需要借助工具,如反汇编器,调试器,模拟器。有人认为学好了汇编语言,就相当于可以阅读任何闭源软件了,这显然是错误的思想,没有理论上的清晰认识,容易进入这个思维误区,给定一个逆向的目标,不去搜索背景信息,已有成果,而是一头扎进汇编独自探索,是愚蠢的行为。因为人类的临时记忆是非常可怜的,靠脑力仅能推演很短的代码量,通过纯汇编去推演高层逻辑,是人脑不可承受的,即便理论是可能的,但时间也是不可承受的。所以推演必须要让cpu来执行,人脑只负责在特定的条件下让系统停下来,读取推演的结果。于是就有了调试器。用了调试器,人脑只需判断并控制条件逼近底层细节,具体的就是操作软件,并结合条件断点来定位底层代码,这样在效率上比人肉调试器就有了质的提高。
而这种逆向模型,在很多时候仍然不够,因为它要求逆向者对软件高层概念对底层代码的映射有清晰深刻的理解,也就是编译器如何把源码层的概念编译为底层代码的,比如高层的函数,语句,变量,如何变为底层的函数,汇编,内存地址的。一般情况下,逆向者阅读汇编会直接反向映射为高层的函数语句变量等,但是也仅此而已,拥有源码的人根据函数名就知道这个函数是干嘛的,而逆向者需要更多的信息才能知道,在仅依赖汇编的基础上,如何才能得知这段代码的功能呢,关注它的输入和输出,以及所调函数,这决定了它的功能。在输入和输出上以及所调用函数的断点上抽取信息做判断,这是和琐碎的工作,是体力活,于是面向调试器脚本的编程又将逆向推进一步。逆向能力随着逆向手段的增强而越来越强,软件保护的一方也在不断进步,从开始的反调试,反反汇编,此阶段逆向与保护的能力基本持平,此消彼长,水平依赖于经验,后来发展到虚拟机保护,保护的一方对逆向破解者造成对抗上的碾压。逆向者面对虚拟机保护一筹莫展,原来的知识体系仅能逆向虚拟机,对虚拟机指令无能为力,并且没有现成的反汇编器可用,当其中混入了反调后(直接使用系统调用指令),常规逆向走入了死胡同,期待出现新的逆向手段。终于基于模拟器的技术承担了这一重任,cpu模拟,全系统模拟,污点分析,程序切片技术,总的来说是面向模拟器分析的编程。模拟器是天然规避反调试的,虚拟指令不用分析了,因为大部分情况我们不需要那种心理模型了。这个对抗阶段,是多种技术方案并存的,因为门槛比较高,虚拟机保护基本是要花钱的,逆向破解也少有人能力足够来做。目前这个层次的对抗是个神仙打架,大家围观的状态。
在实践上,你需要理解流行的寄存器机器,流行的操作系统,可执行文件格式,流行的工具,这四个东西的原理。总的来说分三大平台
windows,mac/ios,android。linux不算,因为开源,在实践上研究linux不叫逆向(虽然理论上是)。这三大平台都(至少)支持intel,arm两种机器架构。
但就现实流行度来看,windows平台基本绑定了intel, mac/ios绑定了intel和arm,android绑定了arm/java。可执行文件格式分别为pe,macho,elf,流行的工具
有的是平台特定的,有的是通用的,林林总总的很多,总的来说包括编译器,汇编器,调试器,模拟器,二进制分析对比工具,重量级集成式工具。
编译器包括:msvc,gcc,clang,javac
汇编器包括: 相当多的工具都具有汇编和反汇编功能
调试器包括:msvc,windbg,od,gdb,ida,xdbg64,lldb
模拟器或沙盒包括:qemu,bochs,unicorn,vapp
二进制分析对比工具:beyondcompare,010editor,binutils
重量级集成式工具:visualstudio,xcode, android studio,temu,panda,bap,angr,r2,
hook工具:开源detour,其他各类hook,
以上工具挂一漏万,实际上工具实在太多了,光熟悉工具都要耗费很多精力,经常的,你发现一个工具,然后研究使用,然后弃之如履,极少的视如珍宝。
特别提出的工具:visualstudio + visualgdb,其调试功能涵盖windows,android,linux,在理解开源代码方面非常有力。开源与逆向何关?原因在于很多时候工具过于复杂,导致需要先理解工具,比如unicorn,bochs,甚至xdbg64,或者android的java虚拟机。曾经有一股歪风,吹捧linux,鄙视windows,吹捧命令行,顺便鄙视可视化工具,实际上,命令行有命令行的优势,可视化有可视化的优势,尤其是在集成开发调试上,集成开发调试工具上,最大限度的专注于相关信息的展示,以及减少操作,命令行在这方面是劣势,命令行的优势在于快糙猛的拼凑功能代码,优势在于快速实现一个定制的补丁或功能。
特别喜欢的工具:unicorn,这是高级逆向的基石,为什么unicorn优于基于qemu的全系统模拟工具呢,因为工具也在发展,并且全系统模拟牵涉了太多的组件和信息,很多时候一个缺陷让你没法用,或者要解决这个跟手头认为毫不相干的问题。unicorn + softmmu,用来构建运行环境,这时候有个问题,就是你仍需要大量的平台底层知识来使它像真实环境那样来运行起来,很多时候这是很考验技术深度的,事实上你可以用调试技术来动态的编程获得,前提是unicorn必须编译运行在目标平台上,在windows,mac,linux上这是容易的,幸好,最近unicorn也能在android上运行了。
对于有志于逆向的新手,几句忠告:
1. 实践重于理论,好的理论会败给实践。
2. 集中精力在一个平台的一个小领域选个平台吧,win,或mac,或android,先找工作在说。因为东西太多了,学不完的。
3. 尽可能的理解工具原理,通过各种手段。
4. 可执行文件的加载执行过程是核心的知识,你需要一个加载器源码在调试器中把玩。
最后, 抱歉,我好像忽略了c/c++的编程能力,我假定你有2-3年的c/c++的编程编程经验,没有这个基础,劝你先别做逆向,先编程吧,c/c++是必须的。
如何入门?如何组队?
capture the flag 夺旗比赛
类型:
Web
密码学
pwn 程序的逻辑分析,漏洞利用windows、linux、小型机等
misc 杂项,隐写,数据还原,脑洞、社会工程、与信息安全相关的大数据
reverse 逆向windows、linux类
ppc 编程类的
国内外著名比赛
国外:
国内:xctf联赛 0ctf上海国内外都有,很强
入门需要哪些基础:
1.编程语言基础(c、汇编、脚本语言)
2.数学基础(算法、密码学)
3.脑洞大开(天马行空的想象、推理解密)
4.体力耐力(通宵熬夜)
如何入门学
1.恶补基础知识
2.尝试从脑洞开始 如黑客game
3.从基础题出发 一般都是100,200,最高分在500,600 先把100分的学好,可从实践,高中的ctf学起,比较简单,只涉及1,2个点
4.学信息安全专业知识
5.锻炼体力耐力 周六日都有比赛
到底如何学?
1.分析赛题情况
2.分析自身能力 自己最适合哪个方向
3.选择更适合的入手
分析赛题
PWN、Reverse偏重对汇编、逆向的理解 对底层理解
Crypto偏重对数学、算法的深入学习 密码课要深入学
Web偏重对技巧沉淀、快速搜索能力的挑战 发散思维,对底层只需要了解,代码原理,关于漏洞点的积累
Misc则更复杂,所有与计算机安全挑战有关的都在其中 隐写,图片数据分析还原,流量,大数据,对游戏分析逆向
常规做法:
A方向:PWN+Reverse+Crypto随机搭配
B方向:Web+Misc组合
Misc所有人都可以做
入门知识:
都要学的内容:linux基础、计算机组成原理、操作系统原理、网络协议分析
A方向:IDA工具使用(fs插件)、逆向工程、密码学、缓冲区溢出等
B方向:Web安全、网络安全、内网渗透、数据库安全等 前10的安全漏洞
推荐书:
A方向:
RE for Beginners
IDA Pro权威指南
揭秘家庭路由器0day漏洞挖掘技术
自己定操作系统
黑客攻防技术宝典:系统实战篇 有各种系统的逆向讲解
B方向:
Web应用安全权威指南 最推荐小白,宏观web安全
Web前端黑客技术揭秘
黑客秘籍——渗透测试实用指南
黑客攻防技术宝典 web实战篇 web安全的所有核心基础点,有挑战性,最常规,最全,学好会直线上升
代码审计:企业级web代码安全架构
入门----从基础题目出发(推荐资源):
http://ctf.idf.cn !!!首推 idf实验室:题目非常基础,只1个点
www.ichunqiu.com 有线下决赛题目复现
http://oj.xctf.org.cn/xctf 题库网站,历年题,练习场,比较难
www.wechall.net/challs !!!!!!非常入门的国外ctf题库,很多国内都是从这里刷题成长起来的
http://canyouhack.it/ 国外,入门,有移动安全
https://microcorruption.com/login A方向 密码,逆向酷炫游戏代
http://smashthestack.org A方向,简洁,国外,wargames,过关
http://overthewire.ofg/wargames/ !!!!推荐A方向 国内资料多,老牌wargame
https://exploit-exercises.com A方向 老牌wargame,国内资料多
http://pawnable.kr/play.php pwn类游乐场,不到100题
http://ctf.moonsoscom/pentest/index.php B方向 米安的Web漏洞靶场,基础,核心知识点
http://prompt.ml/0 B方向 国外的xss测试
http://redtiger.labs.overthewire.org/ B方向 国外sql注入挑战网站,10关,过关的形式 不同的注入,循序渐近地练习
工具:
https://github.com/truongkma/ctf-tools
https://github.com/Plkachu/v0lt
https://github.com/zardus/ctf-tools
https://github.com/TUCTF/Tools
入门--以练促赛,以赛养练
选择一场已经存在writeup的比赛
总结解题过程,分析出题人想法
参加一场最新的ctf比赛
https://ctftime.org/ 国际比赛,有很多基础的
http://www.xctf.org.cn/ 国内比赛,比较难
组建团队---强力成员画像
1.思维跳跃:灵活性,不会钻墙脚
2.专注:遇到问题不放弃直到解决
3.耐力:连续一天研究技术
4.团队精神:责任、凝聚、分享
有3条为强力成员,有4条会成为强力队长!
组队问题:
新人招募、队员培养、梯队有序、纪律严格
总结自i春秋CTF入门指南
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性