1.25寒假作业
web:[UUCTF 2022 新生赛]ez_rce
打开环境,先理解代码,注重代码审计的能力
定义以get传参的方式传参code函数,所以后面我们肯定要以’code=...‘的方式去实现操作,后面禁用了一系列的字符,包括执行函数和一些绕过的字符,没有提示要我们查看或者抓取什么函数或文件,那就是三板斧先看列表ls,再去抓取列表里面的文件。
这边可以先看一下列表,直接看是不行的,因为题目没给你设置执行函数
那首先就先挑一个执行函数,很多函数都被禁用了,exec没有,试一下
不行试一下其他函数
显然是print可以,但是为什么是直接输出引号里面的字符串,去了解才知道print和echo一样是输出函数,和python里面的print很像,区别就是print会返还布尔值,那么这题的执行函数都被禁用了,就只能用这个输出函数怎么样才能变成执行呢?那就要使用`这个反引号,在php中`有特殊的含义就是执行函数的意思,类似shell_exec函数所以当我们把‘换成`时,他就会变成执行函数。
直接查列表没反应,那就看一下底层的列表
看到flag文件了,直接抓,注意层级
pwn:[SWPUCTF 2024 秋季新生赛]兄弟你的环境好香?
查壳,ida
看伪代码,声明buf字节80,后面的red函数又读取256给字节给buf,明显存在溢出
找后门函数的地址
覆盖量256-80,地址0x4011DD,尝试一下,没有反应...为什么别人的覆盖量和地址都和我不一样...地址后为什么还要加一,还有那个大写小写a怎么判断
misc:polar靶场一小时十分后看海
打开图片,可以看到北戴河海滨汽车站37路,直接去地图找找看
直接搜801路公交看看有没有什么地点
一整条路都靠海边,那就看看有没有什么景点,有一个圣蓝海洋公园,南戴河旅游度假区,南戴河仙螺岛游乐中心,阳光国际会议中心海滩浴场等等等,很多个,那这样一个一个去试肯定不是办法,结合题目一小时十分,从起点开始一小时十分的车程估计实在尾部,那就剩南戴河欢乐大世界,圣蓝海洋公园,黄金海岸风景区
一一尝试,确定是黄金海岸风景区,要把风景区去掉才行,服了搞了我好久
crypto:polar靶场spam
打开文件看起来像是一个英语的信件,看起来也没什么规律
根据题目搜看看spam,结合文本得知有一种加密叫垃圾邮件加密,找一下在线网站解密https://spammimic.com/decode.cgi
得到一串由A,B组成的字符串,之前其实也碰到过类似的,是把AB转化成-.的摩斯密码
尝试一下,直接用记事本替换A是.B是-
摩斯密码解密,对应字符串改成{}即可
reserve:[HUBUCTF 2022 新生赛]simple_RE
查壳,ida
看伪代码
代码审计:scanf函数读取我们输入的内容给v6,用sub_401570函数给v6、buf1、v4进行处理,再对比buf1和后面的字符串,起一个检验作用
接着看一下sub_401570函数
这个代码看起来还是挺麻烦的
首先声明变量result为整数64获取a1字符串的长度给v6,v6取余3给v7,设置一个根据v7的判当 v6 %3!=0
时,计算 v8=4*(v6/3)+4
,然后用 malloc
分配 v8+1
个 64 位字节的内存,指针存于 v10
,并将最后一个字节置 0 ;如果 v6<=0
,跳转到 LABEL_5,
当 v6%3=0
时,计算 v8=4*(v6/3)
,同样用 malloc
分配 v8+1
个 64 位字节的内存给 v10
并将最后一个字节置 0 。若 v6<=0
,跳转到 LABEL_8
。
定义一个循环,v11 += 4;
每次循环让 v11
指针后移 4 个字节,从 a1
字符串中按顺序取出字符(v13 = a1[v12];
等操作),并根据复杂的位运算(如 v13>>2
、(v14>>4)|(16 * v13)& 0x30
等)作为索引,从 aQvejaFhmuyjbaC
数组中取值,存储到 v11
相关偏移的内存位置,循环停止的条件是a1处理完成
循环结束后,当 v7=1
时,将 v10[v9-2]
和 v10[v9-1]
赋值为 61(ASCII 码 =
)。
当 v7=2
时,将 v10[v9-1]
赋值为 61(=
),最后将 v10
赋值给 *a2
,0
赋值给 result
,v8
赋值给 *a3
,并返回 result即答案,前面声明的result的长度就是64整数
看一下加密之后的字符串和加密的数组
这题和普通的base64加密不同的就是加密的编码表不一样,是从特定的数组里面取的,所以说base64解密不能用在线网站解密,要自己写脚本,还没接触过这方面的代码编写,其实可以用ai直接写
是可以解出来,不过代码看起来很麻烦,使用的是基于映射base64标准编码表去自定义编码表,这里可以去看看别人怎么写的
不得不说简便很多,但是健壮性没那么好,他没有定义字符编码,不如说我们常用的utf-8,它直接用str.maketrans去定义编码表,要加上字符编码,可以这样操作