CTF思路
点击放大


> 不好意思咕咕咕了这么久,总算在年前改完了,web和misc的wp其他学校的师傅已经写的很好了,这里就不再赘余了(咕咕 经过出题人长达好几天的讨论,最终决定本wp放出部分题解,有的题目介于很多原因就不放了
Y1ng师傅的wp
imagin师傅的wp
咕咕咕
这道题目的大致流程为:对输入做base64编码后的结果与key分别异或,然后再以key作为密钥做RC4加密。因为这道题存在一点问题,所以后面直接根据源码给出求解思路
关于RC4的加解密可以试试这个网站:RC4
此外推荐一篇看雪的关于RC4逆向分析的文章:恶意代码分析之 RC4 算法学习,文章写的比较详细,不过由于本题做了符号剥离,在细节处可能有略微差别。
关于base64,i春秋有一篇文章BASE64编码原理分析脚本实现及逆向案例,不过本题中的base64码表是更改过的,需要特别注意一下。
1. upx脱壳
2. 根据密钥和密文通过RC4解密得到:a5938126a3931275b0b1313085c330b356101511f105c
3. 和key异或得到base64编码
4. base64解密
5. 题目源码
!easy1
拖进IDA查看伪代码,发现主函数内没有任何与flag有关的函数,F12搜索字符串也找不到太多有用的信息。但是在函数窗口可以发现一个叫ques的未被调用的函数。
对ques函数的逻辑进行简单的静态分析可以发现,这个函数的作用其实就是把数组[0x224fc7ffa7e31,0x22a84884a4239 , 0x3ff87084ff235 , 0x33 , 0x231fc7e4243f1]
里的每个元素先转换为二进制,转换的过程中遇到1就输出*,遇到0就输出一个空格。数组的第0个元素对应输出的第0行,第1个元素对应输出的第1行…不难发现,最终输出组合而成的象素图案就是对应的flag。
***当然你也可以在发现了这个后门函数后直接动态调试+修改eip跳转到ques函数的起始地址,一路F8或者下断+F9就可以直接得到flag。
!easy2
BJD{HACKIT4FUN}
在BJD hamburger\BJD hamburger competition_Data\Managed文件夹中找到Assembly-CSharp.dll拖进Dnspy中,找到 ButtonSpawnFruit这个类。
!hum1
可以看到,需要我们按照正确的顺序堆出汉堡才能得到正确的flag。并且在汉堡顶的判断中限制了spawncount必须为5,又因为spawncount从0开始,所以汉堡的层数只能是6.
除去汉堡底和汉堡顶,还剩4种材料,因此这道题就转化成了从7种材料中选4种的问题。
!hum2
得出结果所有可能情况:!hum3 ,以及result的值为‘1001’
把result进行MD5加密后,取前20位。
!hum4
Flag:BJD{B8C37E33DEFDE51CF91E}
PS:这里也可以用itertools模块中的permutations方法求解。
还有一种比较简单的解法,在老八做汉堡的原视频中,老八堆汉堡的顺序是:汉堡底-生菜-臭豆腐-俘虏-加柠檬-汉堡顶,在上文脚本中对应的顺序为5347,同样可以得出最终的result为1001.
btw这道题出现了非预期解:如果直接把这一串哈希值放进在线SHA1解密网站可以直接得到明文为1001,算是出题人的出题的时候不够严谨导致的,在这里给大家说声抱歉…(我暴打我自己)。
3道题目均可暴力求解
十六进制转字符串即可
本题灵感来自2019年第三届i春秋的11月月赛,主要是想对曼切斯特编码进行考察,其中为了提供一下思路,给了一张code的图片作为提示,当然也可以直接自行百度这种编码方式,毕竟他的编码方式也很有特点,仅采用了4种字符,百度一下也可以找到解决方案
编码规则,直接复制的百度百科
在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号;从高到低跳变表示“1”,从低到高跳变表示“0”。还有一种是差分曼彻斯特编码,每位中间的跳变仅提供时钟定时,而用每位开始时有无跳变表示“0”或“1”,有跳变为“0”,无跳变为“1”。
编程思路:
而我们在编程实现时,也很简单只要先将明文转成二进制(也就是先进行NRZ编码),而后对于其中的高电平‘1’,用‘10’替换,低电平‘0’,用‘01’替换,获得一串新的二进制比特流,最后再将其进行16进制封装即可
解码思路:
解码也就是一个逆过程,先将hex转成bin,在一步步替换‘10’为‘1’,‘01’为‘0’
下面给出解密脚本:
最终flag:
BJD{DifManchestercode}
密文:ouauuuoooeeaaiaeauieuooeeiea
hint:IHBsYWludG=
首先将hint base64解密查看提示:The length of this plaintext: 14
而后再观察一下发现密文长度时28位,所以猜测是棋盘密码(额,其实题目就已经提示加密方式了)
观察发现一共有五个字母重复出现在密文中,所以可能的加密表是aeiou,但是解出结果会发现是乱码,所以可以尝试爆破,一共也就5!种情况。
下面是解密脚本:
跑出来两个结果:
显然第一个是最终答案
最后加上格式:
BJD{flagispolybius}
啊啊啊啊啊,最后说一下,这次flag设置的居然和题目名一样,大意了,
( ̄ε(# ̄)☆╰╮o( ̄皿 ̄///),导致赛后有师傅说是直接猜出来的flag,在这里给各位师傅谢罪了(。﹏。),下次flag我会深思熟虑一下了,下次一定,下次一定
很简单的一个rsa,就是再求取欧拉函数是对于(p-1)*(q-1)的获取要先进行一步转换,题中给出了p和q的关系式,及一个求导的过程,化简后可以得出z=p^2+q^2,最后再根据n=p*q,即可得出(p-1)*(q-1)
下面是exp:
题目描述直接给出,模的相关攻击,再看一下给出的附件,发现两次的N是相同的,所以可以确定是共模攻击
!共模攻击
Exp:
这里主要操作是对于e和p的获取,可以看到题中e未知,但是给出了e的范围,并且还有用e加密294后的结果,所以可以尝试去爆破得到e
得出e之后,剩下的问题就是对于n的分解从而得到p,q,很明显直接分解肯定不可能,但是我们可以看到这里q是一个公因数,前后两次加密种只有在一开始时定义了q,所以对于两次的n去取他们的公因数即可获得q,而后再用n除以下q就可得到p
这题主要是对于base64编码方式的理解,题中给出一个码表和密文,解题思路就是利用给出码表,解码即可,此外,这题怪我原本打算只给出码表的键值,一时疏忽把码表直接粘到附件了,下面是我原本的预期解:
首先是根据键值构造码表:
得到码表后,就是根据码表解密文:
这里顺带提一下base64的加密流程
1、将待转换的字符串每三个字节分为一组,每个字节占8bit,那么共有24个二进制位。
2、将上面的24个二进制位每6个一组,共分为4组。
3、在每组前面添加两个0,每组由6个变为8个二进制位,总共32个二进制位,即四个字节。
4、最后再根据码表进行编码
简单来说转换关系就是先将明文的字符串的ASCII码转换为8位的二进制编码,然后在将这串得到的二进制编码按6位为一组(64是2的6次方),然后将划分好的二进制数转换成10进制数并对照上方编码表进行加密。
而相对的解密就是将这编码在按8位为一组划分,再将划分好的二进制数转成10进制的ASCII码,然后根据ASCII码表恢复明文。
Ps.这里我们可以看到转成的二进制数的长度必须是6和8的公倍数,对于那些长度不够的要进行补齐操作,详细的过程这里就不细讲了,看下面这篇文章吧
剩下的工作,也就是这次比赛中获取flag的脚本流程如下:
1、先获取密文再码表中键值
2、将键值转换成六位二进制,不足位填充
3、将获得的六位二进制拼接后按8位拆分转为ASCII码后获得flag
伏羲六十四卦:
题目中给出了几段描述,大致可以猜测一下可能会有多层加密
首先一开始提到六十四卦,百度一下,可以看到其实是利用六位二进制对文字进行替换,根据其二进制矩阵先构造码表,然后根据码表将密文转成二进制:
!fuxi1
第二层:下一步就是将二进制转换成ASCII:
!fuxi2
第三层:发现是base64,再解密:
!fuxi3
发现是一段奇怪的密文,此时附件中的py文件中有提示是加密的源码,分析发现是第四和第五层的加密方式,第四层这里我们可以发现,这里是采用一个偏移量为5并且依次后移一位的加密,这里只要将减换成加即可
得到解密后结果:
Scodfukyhv
而后再是第五层:这里采用了仿射密码,根据加密方式写一下解密脚本即可
最终得到flag:
!fuxi4
加上格式即可:BJD{bjdcongratulationsongettingtheflag}
签到题
考点:命令执行
拖进64位IDA,直接F5 main,然后可以看到case 1:
发现并未过滤传入system的参数,因此直接命令执行即可..完全不用写脚本
payload 如下:
当然还有很多方式,这里就不一一列举了
签到题*2
考点:ret2text
拖进IDA 64,F5
发现程序可以自主控制输入的长度,栈溢出实锤,并且给了后门函数backdoor,直接Ret2text即可
payload:
当然,不想写脚本可以直接python -i一行解决
考点:ret2libc,无libc文件如何查找版本
直接看漏洞函数
可以用puts函数泄露libc基址,之后控制程序回到vuln函数调用system("/bin/sh")函数
libc版本可以使用libcsearcher
payload:
在ret2text的基础上加了整数溢出,本来想考短整型的,但是发现第一天情况不太理想(2333
考点:整数溢出
可以看到虽然有一个条件判断是nbytes>10就会退出程序,但是在read函数中第三个参数是无符号型
此时我们可以输入-1来构造一个回环使得我们输入的值位int64的最大值
payload:
在ret2libc的基础上增加了canary保护
考点:泄露canary
首先看下gift函数
一个标准的格式化字符串漏洞,我们的canary就可以通过gift函数来泄露,然后在我们正常的ret2libc的payload中加上我们泄露出的canary即可绕过canary检查
关于如何泄露canary,我们即然给了格式化字符串漏洞,通过调试可以发现canary在栈的第7个位置,因此可以直接用%7$p泄露
尝试逆开文件观察程序逻辑,可以发现首先输入被利用scanf读到一个数组里面,解析为int类型,然后对每一个数加上了114514这个数进行偏移,最后将读入的这个数组作为字符串与“PvvN| 1S S0 GREAT!”进行比较,如果相同就可以获取shell,则编写python脚本,对该字符串进行反向操作即可,下面是exp
简单的栈溢出,不过前面加上了RSA加密,提示需要输入一个加密后的值,于是到程序中找相关逻辑,其中可以发现在0x00400a70地址处有一个求逆元的函数,可以联想到RSA,每次程序生成一个随机数,输入的值加密后需要等于随机数,观察可得RSA的两个参数E、N分别为65537和497431,于是尝试分解N可以得出私钥,对m用私钥进行加密即可过掉开头的身份验证,然后就是使用return2libc的栈溢出手段即可拿到shell,下面为exp
本次比赛的唯一一道堆题,改编自hitcon training的uaf,这道题是我当初学习pwn堆题的第一题,非常简单,因此出本题是希望18,19级同学能有所收获,没想到本校没人做出QAQ
考点:uaf
漏洞位置:
可以看到我们在free一个chunk的时候并未给这个chunk置NULL,从而导致UAF漏洞的发生
通过逆向可以看出girlfriend结构体为:
func的作用就是打印名字
并且程序给出了后门函数backdoor,我们只需要利用uaf漏洞将func原本指向的函数指向backdoor函数,之后调用即可
payload如下:
[modtogether]:data:image/jpeg;base64,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
开发语言:PHP
Star 数:100
该项目属于CTF思路方向的开源资源,代码结构清晰,适合安全研究人员学习参考。项目围绕A CTF freshman competition organized by Hangzhou Normal University, Jiangsu University of Science and Technology, and Jiangsu University展开,提供了可运行的实现,对理解相关安全机制、工具原理与攻防技术具有较高的研究价值。
从技术实现角度看,此类项目的核心在于对底层原理的深入理解与工程化落地。开发者在研究过程中可以结合官方文档与社区讨论,梳理项目的初始化流程、核心模块职责与数据流转,逐步掌握其中的技术细节与设计思路。
1. 下载源码压缩包,解压到本地环境。
2. 根据项目类型准备对应的运行环境与依赖。
3. 按照 README 中的步骤完成配置与部署。
4. 在隔离的测试环境中运行验证,避免影响生产系统。
本资源来源于开源社区,仅供安全研究、技术学习与合法授权范围内的攻防演练使用,请勿用于任何非法或侵害他人权益的用途。使用本项目产生的一切后果由使用者自行承担。
| 资源标题 | BJDCTF2020_January - 由杭州N主办的CTF新生比赛 |
| 所属分类 | CTF思路 |
| 发布作者 | admin |
| 发布时间 | 2026-10-05 23:55:27 |
| 下载权限 | 免费下载 |
| 附件数量 | 2 个下载链接 |
| 浏览次数 | 366 |
| 讨论数量 | 0 |
| 主题状态 | 正常讨论中 |