云曦春季开学考复现(2025)

发布于:2025-03-09 ⋅ 阅读:(87) ⋅ 点赞:(0)

Crypto

划水的dp和dq

下载附件后是简单的RSA算法题,之所以说简单是因为给了公钥e

趁热打铁,昨天刚学的RSA,既然有p有q,也有e,而n=p*q,可以算出欧拉函数值phi=(p-1)*(q-1)  而这里因为昨天学到d*e=1 mod phi,所以libnum.invmod(e,phi)函数的作用就是求一个整数d,使得(e*d)%phi(除以phi取余)=1,求出d以后,就可以从c=(e,m,n)的模幂运算入手反推m。而c=(e,m,n)可以解释为求m的e次方,然后对取模,结果赋值给c,(pow(m,e,n)=m^e mod n),通俗的讲就是RSA加密时把明文m加密为了c,题目已经给出了c所以用私钥d,函数pow(c,d,n)就可以逆运算出m的值了

然后再long_to_bytes(m)就可以print出flag了

思路清晰以后创建py代码直接运行就可以

可报错了 ,仔细一看我都没有导入libnum库,自然运行不了,然后加入import libnum运行发现我的pycharm还是没有装libnum库,试了一下发现不能直接在pycharm里装,就只能打开终端尝试了好几次终于装上了

最后运行

虽然出flag了,,但我突然想到一个问题,我没用到dp和dq啊,附件既然给了dp dq肯定有用,而且题目也是划水的dp和dq,但又不知道怎么用,于是扔进 AI让其帮我解读一下

所以用dpdq运算会更简单一些的意思,然后我试了一下运行AI改进的代码

它是先计算m1m2两个的值,然后用中国剩余定理组合m,但代码却更复杂了

WEB

熟悉的正则

打开环境先进行代码审计

进行get传参时,把a、b拼接赋值给g

然后查看g中的字符,是否含有/ls|system|a|shell|cat|read|find|flag|handsome/i这串字符,

如果有就又将g赋值给key,同样的又判断key中是否有字符串/\.\.|flag/,如果有就报错“不行不行,再好好看看”

如果没有就把b赋值给gg,然后嘞,截取gg的第八位开始的后面四个字符再赋值给hhh

最后用include函数把base64加密后的a与hhh拼接

这里还原一下正则表达式/\\|\056\160\150\x70/i  其还原回来是|.php

 i是修饰符,表示不区分大小

也就是说参数b的值必须包含字符|.php

总的来说,构造payload的思路就是参数a要含有flag或..字符(用于赋值key)并经过base64加密(include漏洞);参数b需接|.php字符(赋值ggg),且|.php后必须再接  ls|system|a|shell|cat|read|find|flag|handsome 中的某一字符串(用于赋值g),但其长度必须大于等于八个字符(用于绕过并赋值hhh)

先将flag进行base64加密(既然正则表达式  /\.\.|flag/ 还原为的字符是..或flag,按理来说a的值为base64编码 .. 也一样的,但我尝试了一下发现没有回显,也就是不对,是正则表达式还原错了吗)

所以payload为/?a=ZmxhZw==&b=|.php.handsome  (这里用handsome是因为就这个字符串字符数为八个,其他都不足,当然也可以是8个a)

get flag

 RCCE

打开环境进行代码审计

高亮函数展示当前文件,然后调试或展示当前代码。然后检查GET传参是否有参数cmd,如果有便赋值给$cmd变量然后定义黑名单正则表达式$blacklist,并用preg_match 来检查$cmd是否匹配或含有黑名单,(还要注意黑名单后面的i指不区分大小写)如果匹配到了,就输出"师兄说RCE这辈子都学不会,是这样做的么?"如果没有,就执行exec($cmd)(php中执行外部命令的函数,执行命令后不会显示)

那么就需要让exec()函数执行后保存下来,上网查了一下命令

 这里AI也提供了部分绕过该黑名单的字符和方法

得到提示后那么接下来构造payload即可   ?cmd=ls / | tee 1.txt 

但要注意ls是黑名单,所以要将ls改一下绕过  l\s

然后exec()应该是已经执行过后并将结果保存到1.txt中了,url拼接一下就可以看到flag提示

最后传参抓取flag就可以了,然后把抓取结果保留到2.txt中

继续拼接访问得到flag 


网站公告

今日签到

点亮在社区的每一天
去签到