芜湖
不评价 以下仅是自己的一些思路和解析 有什么问题或者建议随时都可以联系我
目录
题目一 来都来了
操作内容:
flag值:
题目二 Honor
操作内容:
flag值:
题目三 我看看谁还不会RSA
操作内容:
flag值:
题目四 hakiehs
操作内容:
flag值:
题目五 Font
操作内容:
flag值:
题目六 ApeCoin
操作内容:
flag值:
题目七 Easyphp
操作内容:
flag值:
题目八 Ezupload
操作内容:
flag值:
题目九 get_source
操作内容:
flag值:
加油各位( •̀ ω •́ )y 期待与君再相逢
解题思路及过程
题目一 来都来了
操作内容:
附件只有一个压缩包
但解压需要密码 我们查看源码 经过对比 发现是伪加密
将09改为00
得到题目
很明显是base解码
将其放在txt里
使用not++打开 缩放 得到flag
flag值:
flag{cp2ae315-eef4-3fra-a768-cd9xb19cdk4e}
题目二 Honor
操作内容:
附件只有图片一张
正常的查看源码
发现存在第二张图片
Kali foremost分离
得图
经过多工具尝试
使用stegdetect判断存在隐写
Stegdetect.exe -tjopi -s 10.0 00001995.jpg
然后用stegseek使用rockyou字典(kali自带)爆破
stegseek 00000000.jpg rockyou.txt
得到最终加密字符
f6l3-a6ag3c}{-bc4c5e28-e4649c76b0-707e6069
这不是栅栏密码就是凯撒密码
经过尝试 栅栏密码 12栏数
在线网站 (标准的他还跑不出来)
栅栏加密/解密 - Bugku CTF
flag值:
flag{424c076e-768c-3636-acb5-4676900b9eec}
题目三 我看看谁还不会RSA
操作内容:
只有一个py
这一看标准的RSA
根据源编码 编写脚本
这里提供两个 脚本
from Crypto.Util.number import *
c=8232151627233115772131180151146951323147507324390914513031444555762539986162650
p=8666789885346075954502743436174521501697
q=2449101960789395782044494299423558347143
n = p*q
phin = (p-1)*(q-1)
e=37777
m = pow(c,e,n)
print(long_to_bytes(m))
import gmpy2
from Crypto.Util.number import *
def find_m(c, d, n, p, q):
f = (p - 1) * (q - 1)
e = 37777
d_inv = gmpy2.invert(d, f)
m = pow(c, d_inv, n)
return m
c = 8232151627233115772131180151146951323147507324390914513031444555762539986162650
e=37777
p = 8666789885346075954502743436174521501697
q = 2449101960789395782044494299423558347143
n = p*q
f = (p-1)*(q-1)
d = gmpy2.invert(e,f)
m = find_m(c, d, n, p, q)
print(long_to_bytes(m))
flag值:
flag{r5a_Who_w0nt}
题目四 hakiehs
操作内容:
还是只有一个文件
Vsdx的后缀
像这种文档类文件 我们可以直接转化为压缩包格式的 在里面查找线索
解压缩
Crypto-hakiehs\attachment\attachment\visio\media
在这个地址找到 图片密文
进过信息检索
找到相对应的对照表
对照 字母小写 得flag
flag值:
flag{linkzeldaganon}
题目五 Font
操作内容:
这个题有点意思 玩脑洞 完全可以当misc出了
附件是只有一张图片
敏捷的狐狸和懒惰的狗
在图片属性里发现提示
刚开始以为是emoji解密 也试了aea 都不行
所以这种加密方式只可能是出题人自创的
对照表要么在图片里 要在文字里
但要考虑到这个题是密码题 不是misc
所以应该没有太多的隐写 就想简单点
总共有两行
猜测 一行是答案 一行是对照的
总共35的字符
然后看图片
图片的字面意思就是
一只敏捷的棕色狐狸扑向一只懒狗
翻译一下 要凑够35个字符
theQuickbrownfoxjumpsoverthelazydog
用这个去和第一行(◎☀◐♬¤☾♀☹☽§♪℗♩☑♪®♂¤☒♫〼♪۞◐§◎☀◐◑☼♭©☺♪√)组成对照表
√:g;♪:0;☺ d;© y;♭ z;☼ a;◑ l;◐ e;☀ h;◎ t;§ r;◐ e;۞ v;♪ o;〼 s;♫ p;☒ m;¤ u;♂ j;® x;♪ o;☑ f;♩ n;℗ w;♪ o;§ r;☽ b;☹ k;♀ c;☾ i;¤ u;♬ q;◐ e;☀ h;◎ t
最后根据这个对照表
去解第二行 得到flag
flag值:
flag{qtsyjfgvbndhflhgfnmjfhko}
题目六 ApeCoin
操作内容:
使用dirsearch扫描目录,发现源码泄露
在/static/font/目录下发现.txt.php后门文件
在CMD5解密得到连接密码74658263,使用冰蝎连接得到flag
flag值:
flag{50ddd4d4-c403-422f-af67-3805077076aa}
题目七 Easyphp
操作内容:
根据提示使用php伪协议读取hint.php文件
Base64解码后得到源文件
根据hint.php代码可知,需要构造pop链来执行get->__call中的eval函数。
各魔术方式调用方式
__call():调用不存在或不可见的成员方法时,PHP会先调用__call()方法来存储方法名及其参数
__isset():当对一个对象的不存在或不可访问的属性使用 isset() 或 empty() 函数时自动调用,传递属性名作为参数。
__wakeup():在对象被反序列化(使用 unserialize() 函数)之前自动调用,可以在此方法中重新初始化对象状态。
__destruct():类的析构函数,在对象销毁之前自动调用析构函数
__toString():当使用echo或print输出对象将对象转化为字符串形式时,会调用__toString()方法
构造的pop链(倒推)为:使用__isset()触发__call(),然后使用__toString触发__isset(),最后使用__destruct()触发__toString()。要注意的是__wakeup不能使用表示属性个数的值大于真实属性个数的方法绕过,但是我们可以让dog->b的地址给a,再将c赋值ct类。get::__call()->mouse::__isset()->ct::__toString()->dog::__destruct()
又因为hint.php过滤了很多函数
所以将表示字符串类型的s大写为S,其对应的值会被当作十六进制解析(长度不能改变)
查看realflag目录下的文件
查看you_want_flag.php文件得到flag
得到flag
flag值:
flag{28fabc34-48bb-4959-b3c7-a67ddb343d8d}
题目八 Ezupload
操作内容:
使用dirsearch扫描目录发现flag文件,访问得到flag
得到flag
flag值:
flag{71a58713-31d7-4ae7-a5f7-d4889a8ec2e3}
题目九 get_source
操作内容:
访问地址发现该网站使用的是php7.4.21。想到了php<=7.4.21Development Server源码泄露漏洞,利用该漏洞查看idnex.php
要POST传入a,b,pwn三个变量且a不能等于b且a的MD5值要和pwn的sha1值相等,我们可以使用数组绕过得到flag
得到flag
flag值:
flag{25e02e06-3553-4a5b-bfa9-b1fff4745dde}