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中,但是由于权限问题无法查看

image-20230428152424830

使用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以内的数,于是开爆破

image-20230428152513926

爆破后有一张图片,直接转码保存

image-20230428152559718

图片如下

image-20230428152624723

放到010editor中,发现有一个隐藏的字符串

image-20230428152657769

将img参数改为ffffpq.php的base64编码格式即ZmZmZnBxLnBocA==

image-20230428152723340

base64解码得到flag

image-20230428152739157

Misc

0x01 time

拿到题目后发现是38个txt文件,打开发现每个文件里的内容是一样的,根据题目提示,猜测文件中的内容应该是时间戳

image-20230427165710201

时间戳转换成时间后发现和txt文件的创建时间差不多

image-20230427165802639

在kali中获取每个文件的创建时间,精确到秒

image-20230427165851429

将所有的文件创建时间转换成时间戳,这里文件不多直接手撸了,转换成后只有后三位和题目一开始所给的时间戳不一样,猜测是十进制转成字符串。

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打开后文件头没问题,但是文件尾不对,找到正确的文件尾

image-20230427170241173

发现文件尾后面的字符很可疑,拿出来后base64一下

image-20230427170419586

得到压缩包的密码,熟悉的能够看出来key的值是jpg图片的文件头

解出压缩包中的文件用文本编辑器打开发现是十六进制

丢进CyberCher,发现是jpg文件

image-20230427170710980

直接导出是不行的,需要补全文件头,文件头就是key的值,导出后得到二维码

image-20230427170746457

扫描得到flag

flag{gatkczewo93ujhn1ybxv0d75pisql8m6}

0x03 wordexcelppt

拿到附件是个word文档,打开看了没有什么东西,直接改成zip

image-20230427170958246

error.xml

image-20230427171023724

Base64,直接解码得到png文件

image-20230427171103006

扫码得到flag

image-20230427171126903

flag{40ccf25d8244893c2eb9013265da1842}

0x04 图片里的秘密

wordbinwalk分离得到pass.txt,是个密码

image-20230428112813009

之前做过红明谷的一道题目很像,猜测PixelJihad加密

image-20230428112759043

flag{l0mbj9y2zknswf5p8v3e6ogcudtx1h}

0x05 easymisc

下载附件解压后,得到很多图片,经过对比,该图片比较大,经过观察,会闪现一个二维码

img

扫码得到百度网盘地址

链接:https://pan.baidu.com/s/1D-XdJvkKWbVFoRx_AEZZzw?pwd=v6p6

提取码:v6p6

img

下载game.tar文件,拿到kali里,把tar附件解压后搜索了一下flag,发现docker存在/mnt/flag.txt

img

根据提示拉取镜像

img

根据搜索结果,在mnt下发现了flag.txt文件

img

flag.txt拷贝出来,打开发现是假的

img

再尝试把559.gif拉取来

img

打开后发现是个二维码

img

拖入到macos打开 提取图片出来

img

用ps进行拼接,得到二维码

img

扫描得到flag{23801da392afbb47df53f9f5750cea33}

Reverse

0x01 rust

程序拿到手file查看竟然是arm架构的

image-20230428104647799

运行一下,根据字符串找到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!",如果用户输入的数字等于随机数,打印加密后的字符串,并退出循环。

只有一层,直接可以手撸,应该非预期了。

image-20230428102006670

flag{a04081134e4c00a2659255edfa726605}

最后修改:2023 年 11 月 25 日
如果觉得我的文章对你有用,请随意赞赏