Web
0x01 仔细ping
题目类似于之前的pingpingping
,打开题目,题目默认是传入参数ip=127.0.0.1,一开始以为是应该在后面加&
来执行命令,后来发现是直接将127.0.0.1改为你要执行的命令,题目中限制比较多,找了半天指令,发现只有nl
指令能用,nl的作用网上的解释是
_NL是一个LINUX命令,可以为输出列加上编号,也是编号过滤工具。
所以最终的payload构造如下
?ip=nl%20flag.php
0x02 May_be
题目代码找不到了,直接贴思路吧,前面的绕过就不详细进行解释了,只针对最后文件权限进行一下讲解
payload:
?a=eval(end(current(get_defined_vars())));&b=system(%27pwd%27);
将其中的pwd替换为想要执行的Linux命令就可以执行命令了,ls一下根目录发现没有flag,但是有一个pushflag.sh的文件,查看他,发现文件在隐藏文件/.ffffffIIIIIII44444444444ggg
中,但是由于权限问题无法查看
使用find / -user root -perm -4000 -print 2>/dev/null
命令查看权限,发现cp命令有权限,于是先cp /etc/shadow
到/tmp/111
然后再`cp /.ffffffIIIIIII44444444444ggg /tmp/111
覆盖掉,直接cat /tmp/111
即可得到flag
0x03 pop
payload:O:2:"TT":3:{s:3:"key";O:2:"JJ":1:{s:3:"obj";O:2:"MM":2:{s:4:"name";s:6:"system";s:1:"c";s:9:"cat /flag";}}s:1:"c";N;}
0x04 notrce
```
<?php
highlight_file(__FILE__);
error_reporting(0);
$c=$_POST['c'];
if(!preg_match("/vi|less|tail|head|od|sh|echo|touch|re|mv|rm|cat|ls|tac|more|cut|curl|wget|base|>|<|`|\*|\\$|\\\/i",$c)){ exec($c);
}else{
die("hacker");
}
题目进行了过滤,考虑使用文件读取输出到其他文件中读取flag,所以payload如下
c=cp /flag 3.txt
访问3.txt文件即可
0x05 完美网站
打开网站发现一直提示重定向
提示缺少参数n,且n为30-10以内的数,于是开爆破
爆破后有一张图片,直接转码保存
图片如下
放到010editor中,发现有一个隐藏的字符串
将img参数改为ffffpq.php
的base64编码格式即ZmZmZnBxLnBocA==
base64解码得到flag
Misc
0x01 time
拿到题目后发现是38个txt文件,打开发现每个文件里的内容是一样的,根据题目提示,猜测文件中的内容应该是时间戳
时间戳转换成时间后发现和txt文件的创建时间差不多
在kali中获取每个文件的创建时间,精确到秒
将所有的文件创建时间转换成时间戳,这里文件不多直接手撸了,转换成后只有后三位和题目一开始所给的时间戳不一样,猜测是十进制转成字符串。
str = [102,108,97,103,123,101,51,48,100,97,57,52,48,101,101,102,57,55,49,56,102,49,100,98,99,52,97,48,100,48,99,100,101,49,101,99,98,125]
flag = ''
for i in str:
flag += chr(i)
print(flag)
#flag{e30da940eef9718f1dbc4a0d0cde1ecb}
0x02 传说中的小黑
拿到题目是一张jpg图片,第一眼的感觉是宽度有问题,后来发现不是,先用binwalk分离一下得到一个压缩包,但是有密码。
后来用010打开后文件头没问题,但是文件尾不对,找到正确的文件尾
发现文件尾后面的字符很可疑,拿出来后base64一下
得到压缩包的密码,熟悉的能够看出来key的值是jpg图片的文件头
解出压缩包中的文件用文本编辑器打开发现是十六进制
丢进CyberCher,发现是jpg文件
直接导出是不行的,需要补全文件头,文件头就是key的值,导出后得到二维码
扫描得到flag
flag{gatkczewo93ujhn1ybxv0d75pisql8m6}
0x03 wordexcelppt
拿到附件是个word文档,打开看了没有什么东西,直接改成zip
error.xml
Base64,直接解码得到png文件
扫码得到flag
flag{40ccf25d8244893c2eb9013265da1842}
0x04 图片里的秘密
wordbinwalk分离得到pass.txt,是个密码
之前做过红明谷的一道题目很像,猜测PixelJihad加密
flag{l0mbj9y2zknswf5p8v3e6ogcudtx1h}
0x05 easymisc
下载附件解压后,得到很多图片,经过对比,该图片比较大,经过观察,会闪现一个二维码
扫码得到百度网盘地址
链接:https://pan.baidu.com/s/1D-XdJvkKWbVFoRx_AEZZzw?pwd=v6p6
提取码:v6p6
下载game.tar文件,拿到kali里,把tar附件解压后搜索了一下flag,发现docker存在/mnt/flag.txt
根据提示拉取镜像
根据搜索结果,在mnt下发现了flag.txt文件
flag.txt拷贝出来,打开发现是假的
再尝试把559.gif拉取来
打开后发现是个二维码
拖入到macos打开 提取图片出来
用ps进行拼接,得到二维码
扫描得到flag{23801da392afbb47df53f9f5750cea33}
Reverse
0x01 rust
程序拿到手file查看竟然是arm架构的
运行一下,根据字符串找到main函数
__int64 untitled1::main::hac4d19c5bbf0252b()
{
__int64 v0; // x0
unsigned int v1; // w19
_QWORD *v2; // x0
bool v3; // zf
signed __int64 v4; // x8
__int64 v5; // x0
__int64 v6; // x0
__int64 v7; // x0
__int64 v8; // x0
__int64 v9; // x21
unsigned __int64 v10; // x0
unsigned __int64 v11; // x8
size_t v12; // x21
signed __int64 v13; // x22
__int64 (__fastcall *v14)(); // x0
BOOL v15; // w8
__int64 result; // x0
signed __int64 v17; // [xsp+8h] [xbp-118h]
__int64 v18; // [xsp+10h] [xbp-110h]
__int64 v19; // [xsp+18h] [xbp-108h]
__int64 v20; // [xsp+20h] [xbp-100h]
unsigned int v21; // [xsp+2Ch] [xbp-F4h]
__int64 v22; // [xsp+30h] [xbp-F0h]
__int64 v23; // [xsp+38h] [xbp-E8h]
_QWORD *v24; // [xsp+48h] [xbp-D8h]
__int64 *v25; // [xsp+50h] [xbp-D0h]
void *v26; // [xsp+58h] [xbp-C8h]
__int64 v27; // [xsp+60h] [xbp-C0h]
__int64 **v28; // [xsp+68h] [xbp-B8h]
__int64 v29; // [xsp+70h] [xbp-B0h]
__int64 *v30; // [xsp+B0h] [xbp-70h]
__int64 (__fastcall *v31)(); // [xsp+B8h] [xbp-68h]
size_t v32; // [xsp+C0h] [xbp-60h]
v26 = &unk_100044250;
v27 = 1LL;
v24 = 0LL;
v28 = (__int64 **)&unk_100036790;
v29 = 0LL;
v0 = std::io::stdio::_print::h7da8721ceb273a47(&v24);
v24 = (_QWORD *)rand::thread_rng::h09cee9d0f6e4e109(v0);
do
v1 = _$LT$rand..ThreadRng$u20$as$u20$rand..Rng$GT$::next_u32::ha31036b56bd3ada4(&v24);
while ( v1 >= 0xFFFFFFFE );
v2 = v24;
v3 = (*v24)-- == 1LL;
if ( v3 )
{
v4 = v2[1] - 1LL;
v2[1] = v4;
if ( !v4 )
((void (*)(void))__rust_dealloc)();
}
v17 = 17LL;
while ( 1 )
{
v26 = &unk_100044260;
v27 = 1LL;
v24 = 0LL;
v28 = (__int64 **)&unk_100036790;
v29 = 0LL;
v5 = std::io::stdio::_print::h7da8721ceb273a47(&v24);
v18 = 0LL;
v19 = 1LL;
v20 = 0LL;
v22 = std::io::stdio::stdin::ha8aff6924d119313(v5);
std::io::stdio::Stdin::read_line::h8719fe83278d86e1(&v22, &v18);
if ( v24 )
{
v30 = v25;
core::result::unwrap_failed::h334387d5f1f555c1(
"Failed to read linesrc/main.rsYou guessed: \nToo big!\nflag isToo small!\n",
19LL,
&v30,
&unk_100044230,
&unk_100044270);
}
v6 = core::str::_$LT$impl$u20$str$GT$::trim_matches::h000176bb58466fe5(v19, v20);
v7 = core::num::_$LT$impl$u20$core..str..traits..FromStr$u20$for$u20$u32$GT$::from_str::h02d977fc541f3f32(v6);
if ( !(v7 & 1) )
break;
LABEL_26:
if ( v18 )
__rust_dealloc(v19, v18, 1LL);
}
v21 = HIDWORD(v7);
crypto::md5::Md5::new::hd7fd1ae68d7daaf9();
v8 = __rust_alloc(17LL, 1LL);
if ( !v8 )
goto LABEL_35;
v9 = v8;
*(_BYTE *)(v8 + 16) = 33;
*(_OWORD *)v8 = *(_OWORD *)"Guess the number!Guess the number!\n"
"Please input your guess.\n"
"Failed to read linesrc/main.rsYou guessed: \n"
"Too big!\n"
"flag isToo small!\n";
_$LT$crypto..md5..Md5$u20$as$u20$crypto..digest..Digest$GT$::input::hd4e730dc5bde7abc(&v24, v8, 17LL);
__rust_dealloc(v9, 17LL, 1LL);
v10 = _$LT$crypto..md5..Md5$u20$as$u20$crypto..digest..Digest$GT$::output_bits::hf6e4f88cc30b6743(&v24);
v11 = v10 + 7;
if ( v10 != 0 && v10 < 0xFFFFFFFFFFFFFFF9LL )
{
v12 = v11 >> 3;
v14 = (__int64 (__fastcall *)())__rust_alloc(v11 >> 3, 1LL);
if ( !v14 )
{
v17 = v12;
LABEL_35:
alloc::alloc::handle_alloc_error::h1d9de7391f28bb67(v17, 1LL);
}
v13 = (signed __int64)v14;
v30 = (__int64 *)v12;
v31 = v14;
bzero(v14, v12);
}
else
{
v12 = 0LL;
v30 = 0LL;
v31 = (__int64 (__fastcall *)())1;
v13 = 1LL;
}
v32 = v12;
_$LT$crypto..md5..Md5$u20$as$u20$crypto..digest..Digest$GT$::result::h65558ae2155ebc02(&v24, v13, v12);
_$LT$$u5b$u8$u5d$$u20$as$u20$rustc_serialize..hex..ToHex$GT$::to_hex::h711d8b61f6068579(v13, v12);
if ( v12 )
__rust_dealloc(v13, v12, 1LL);
v30 = (__int64 *)&v21;
v31 = core::fmt::num::imp::_$LT$impl$u20$core..fmt..Display$u20$for$u20$u32$GT$::fmt::h0a55ca9d3058df58;
v26 = &unk_100044288;
v27 = 2LL;
v24 = 0LL;
v28 = &v30;
v29 = 1LL;
std::io::stdio::_print::h7da8721ceb273a47(&v24);
if ( v21 <= v1 )
v15 = 1;
else
v15 = v21 != v1 + 1;
if ( v15 == 1 )
{
v26 = &unk_1000442A8;
v27 = 1LL;
v24 = 0LL;
v28 = (__int64 **)&unk_100036790;
v29 = 0LL;
std::io::stdio::_print::h7da8721ceb273a47(&v24);
LABEL_24:
if ( v22 )
__rust_dealloc(v23, v22, 1LL);
goto LABEL_26;
}
if ( (unsigned __int8)v15 == 255 )
{
v26 = &unk_1000442D8;
v27 = 1LL;
v24 = 0LL;
v28 = (__int64 **)&unk_100036790;
v29 = 0LL;
std::io::stdio::_print::h7da8721ceb273a47(&v24);
goto LABEL_24;
}
v30 = &v22;
v31 = _$LT$alloc..string..String$u20$as$u20$core..fmt..Display$GT$::fmt::hd0c88bc42ee7e645;
v26 = &unk_1000442B8;
v27 = 2LL;
v24 = 0LL;
v28 = &v30;
v29 = 1LL;
result = std::io::stdio::_print::h7da8721ceb273a47(&v24);
if ( v22 )
result = __rust_dealloc(v23, v22, 1LL);
if ( v18 )
result = __rust_dealloc(v19, v18, 1LL);
return result;
}
分析主函数代码,是一个简单的猜数字游戏,逻辑很简单,根据输入数字的大小,如果输入的数字小于随机数,打印 "Too small!",如果用户输入的数字大于随机数,打印 "Too big!",如果用户输入的数字等于随机数,打印加密后的字符串,并退出循环。
只有一层,直接可以手撸,应该非预期了。
flag{a04081134e4c00a2659255edfa726605}