生活随笔
收集整理的這篇文章主要介紹了
REVERSE-PRACTICE-BUUCTF-22
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
REVERSE-PRACTICE-BUUCTF-22 [SCTF2019]Who is he [FlareOn2]very_success [NPUCTF2020]Baby Obfuscation [HDCTF2019]MFC
[SCTF2019]Who is he
unity游戲,運行后輸入,點擊按鈕檢驗輸入 dnSpy打開Who is he\Who is he_Data\Managed\Assembly-CSharp.dll 在TestClick類中找到OnClick方法,將輸入與Decrypt方法返回的字符串比較 Decrypt方法,標準的DES.CBC解密,iv=key 已知密鑰"1234",密文"1Tsy0ZGotyMinSpxqYzVBWnfMdUcqCMLu0MA+22Jnp+MNwLHvYuFToxRQr0c+ONZc6Q7L0EAmzbycqobZHh4H23U4WDTNmmXwusW4E+SZjygsntGkO2sGA==",解DES.CBC,注意,在C#中,字符串轉成字節數組,在每個字符字節后都要加一個"\x00",然而提交明文失敗
from Crypto
. Cipher
import DES
import base64
key
= '' . join
( [ '1' , '\x00' , '2' , '\x00' , '3' , '\x00' , '4' , '\x00' ] )
cipher
= base64
. b64decode
( "1Tsy0ZGotyMinSpxqYzVBWnfMdUcqCMLu0MA+22Jnp+MNwLHvYuFToxRQr0c+ONZc6Q7L0EAmzbycqobZHh4H23U4WDTNmmXwusW4E+SZjygsntGkO2sGA==" )
iv
= key
des
= DES
. new
( key
, DES
. MODE_CBC
, iv
)
plaintext
= des
. decrypt
( cipher
)
print ( plaintext
. decode
( 'utf-16' ) )
看了別的師傅的wp,使用ce,搜索字符串"Emmmmm",在內存中發現完全不同的密文和密鑰 解DES.CBC得到flag,提交成功
from Crypto
. Cipher
import DES
import base64
key
= '' . join
( [ 't' , '\x00' , 'e' , '\x00' , 's' , '\x00' , 't' , '\x00' ] )
data
= "78 00 5A 00 57 00 44 00 5A 00 61 00 4B 00 45 00 68 00 57 00 4E 00 4D 00 43 00 62 00 69 00 47 00 59 00 50 00 42 00 49 00 6C 00 59 00 33 00 2B 00 61 00 72 00 6F 00 7A 00 4F 00 39 00 7A 00 6F 00 6E 00 77 00 72 00 59 00 4C 00 69 00 56 00 4C 00 34 00 6E 00 6A 00 53 00 65 00 7A 00 32 00 52 00 59 00 4D 00 32 00 57 00 77 00 73 00 47 00 6E 00 73 00 6E 00 6A 00 43 00 44 00 6E 00 48 00 73 00 37 00 4E 00 34 00 33 00 61 00 46 00 76 00 4E 00 45 00 35 00 34 00 6E 00 6F 00 53 00 61 00 64 00 50 00 39 00 46 00 38 00 65 00 45 00 70 00 76 00 54 00 73 00 35 00 51 00 50 00 47 00 2B 00 4B 00 4C 00 30 00 54 00 44 00 45 00 2F 00 34 00 30 00 6E 00 62 00 55 00 3D"
cipher
= [ ]
for i
in range ( 0 , len ( data
) , 6 ) : cipher
. append
( int ( '0x' + data
[ i
: i
+ 2 ] , 16 ) )
iv
= key
des
= DES
. new
( key
, DES
. MODE_CBC
, iv
)
plaintext
= des
. decrypt
( base64
. b64decode
( '' . join
( chr ( i
) for i
in cipher
) ) )
print ( plaintext
. decode
( 'utf-16' ) )
[FlareOn2]very_success
exe程序,運行后輸入password,無殼,ida分析 sub_401000函數修改棧指針平衡棧后,F5反編譯 讀取輸入,進入sub_401084函數進行驗證,返回非0驗證成功 進入sub_401084函數,檢驗輸入的長度是否大于等于37,輸入input參與的只是8位的異或運算,v14為0xc7,v10在運算過程中始終為1,v4初始為0,每次都要加一個字節參與運算后的結果 v7可通過動調得到,只有32個字節可見,不過影響不大,寫逆腳本即可得到flag,缺的5個字符按照Description文本文件提示補齊
v7
= [ 0xAA , 0xEC , 0xA4 , 0xBA , 0xAF , 0xAE , 0xAA , 0x8A , 0xC0 , 0xA7 , 0xB0 , 0xBC , 0x9A , 0xBA , 0xA5 , 0xA5 , 0xBA , 0xAF , 0xB8 , 0x9D , 0xB8 , 0xF9 , 0xAE , 0x9D , 0xAB , 0xB4 , 0xBC , 0xB6 , 0xB3 , 0x90 , 0x9A , 0xA8 ]
v7
= v7
[ : : - 1 ]
flag
= ""
v4
= 0
for i
in range ( len ( v7
) ) : tmp
= ( 1 << ( v4
& 0x3 ) ) flag
+= chr ( ( v7
[ i
] - tmp
- 1 ) ^ 0xc7 ) v4
+= v7
[ i
]
print ( flag
)
[NPUCTF2020]Baby Obfuscation
exe程序,運行后輸入,無殼,ida分析 main函數,輸入后緊接的for循環,有4個if語句,其中第1和第3個if語句永真,第2和第4個if語句永假,于是,與輸入相關的運算有兩處,"v33[j]=input[j-1]-v39[(j-1)%len(v39)]"給v33賦值,"v33[j]^=v39[(j-1)%len(v39)]"是v33的變換,v33的元素乘10后再與已知比較
int __cdecl
main ( int argc
, const char * * argv
, const char * * envp
)
{ int v3
; int v4
; int v5
; int v6
; int v7
; int v8
; int v9
; int v10
; int v11
; int v12
; int v13
; int v14
; int v15
; int v16
; int v17
; int v18
; bool v19
; int v20
; int v21
; int v22
; int v23
; int v24
; int v25
; int v26
; int v27
; int v28
; int a
[ 64 ] ; int v31
; char input
[ 1008 ] ; int v33
[ 1000 ] ; int v34
; int v35
; int v36
; int v37
; int v38
; int v39
; int v40
; int v41
; int v42
; int input_len
; int k
; int j
; int i
; _main ( ) ; memset ( v33
, 0 , sizeof ( v33
) ) ; v34
= 0 ; memset ( a
, 0 , sizeof ( a
) ) ; v31
= 0 ; for ( i
= 0 ; i
<= 64 ; ++ i
) a
[ i
] = i
+ 1 ; v39
= 2 ; v40
= 3 ; v41
= 4 ; v42
= 5 ; v35
= 2 ; v36
= 3 ; v37
= 4 ; v38
= 5 ; puts ( "WHERE IS MY KEY!?" ) ; scanf ( "%32s" , input
) ; input_len
= strlen ( input
) ; v3
= gcd ( a
[ j
] , a
[ j
] ) ; for ( j
= v3
/ a
[ j
] ; j
<= input_len
; ++ j
) { v4
= ( a
[ j
] + a
[ j
+ 1 ] ) * ( a
[ j
] + a
[ j
+ 1 ] ) ; if ( v4
>= axxb ( 2 , 2 ) * a
[ j
] * a
[ j
+ 1 ] ) { v5
= ~ input
[ a_sub_b ( j
, 1 ) ] ; v6
= a_sub_b ( j
, 1 ) ; v33
[ j
] = ~ ( v5
+ * ( & v39
+ v6
% axxb ( 2 , 2 ) ) ) ; } v7
= gcd ( a
[ j
] , a
[ j
+ 1 ] ) ; if ( v7
> gcd ( a
[ j
+ 1 ] , ~ ( ~ a
[ j
+ 1 ] + a
[ j
] ) ) ) { v8
= v33
[ j
] ; v9
= ~ v33
[ j
] ; v10
= a_sub_b ( j
, 1 ) ; v33
[ j
] = ~ ( v9
+ a
[ v10
% axxb ( 2 , 2 ) ] ) * v8
; } v11
= a
[ j
+ 1 ] ; v12
= axxb ( 2 , 1 ) * v11
; v13
= a
[ j
] ; v14
= axxb ( 2 , 1 ) ; v15
= gcd ( v13
* v14
, v12
) ; v16
= axxb ( 2 , 1 ) ; if ( v15
== v16
* gcd ( a
[ j
] , a
[ j
+ 1 ] ) ) { v17
= a_sub_b ( j
, 1 ) ; v33
[ j
] ^ = * ( & v39
+ v17
% axxb ( 2 , 2 ) ) ; } v18
= axxb ( V0X3
, a
[ j
] ) ; v19
= v18
< a
[ j
] + 1 ; v20
= axxb ( 2 , 4 ) ; if ( aeqbeq1 ( v20
>= j
, v19
) ) { v21
= ~ input
[ a_sub_b ( j
, 1 ) ] ; v22
= a_sub_b ( j
, 1 ) ; v33
[ j
] ^ = ~ ( v21
+ * ( & v39
+ v22
% axxb ( 2 , 2 ) ) ) ; } v23
= axxb ( 2 , 3 ) ; v24
= gcd ( a
[ j
] , a
[ j
] ) ; v33
[ j
] * = v23
+ axxb ( 2 , v24
/ a
[ j
] ) ; } v25
= axxb ( 2 , 4 ) ; v26
= a_sub_b ( v25
, 1 ) ; if ( v26
== input_len
) { v27
= gcd ( a
[ k
] , a
[ k
] ) ; for ( k
= v27
/ a
[ k
] ; k
<= input_len
; ++ k
) { v28
= v33
[ k
] ; if ( v28
== a_sub_b ( A0X6
[ k
] , 1 ) / 10 ) ++ V0X2
; } if ( V0X2
== input_len
) puts ( "\nPASS" ) ; else puts ( "\nDENIED" ) ; } else { puts ( "\nDENIED" ) ; } return 0 ;
}
寫逆運算腳本即可得到flag
A0X6
= [ 0 , 7801 , 7801 , 8501 , 5901 , 8001 , 6401 , 11501 , 4601 , 9801 , 9601 , 11701 , 5301 , 9701 , 10801 , 12501 ]
v39
= [ 2 , 3 , 4 , 5 ]
for i
in range ( 1 , len ( A0X6
) ) : A0X6
[ i
] = ( A0X6
[ i
] - 1 ) // 10 // 10 A0X6
[ i
] ^ = v39
[ ( i
- 1 ) % len ( v39
) ] A0X6
[ i
] += v39
[ ( i
- 1 ) % len ( v39
) ]
print ( '' . join
( chr ( i
) for i
in A0X6
) )
[HDCTF2019]MFC
MFC程序,加了vmp殼,用xspy掃一下 發現一個沒有系統庫名的OnMsg:0464 寫C代碼發送一條有關0x0464的信息
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
int main ( )
{ HWND handler
= : : FindWindowA ( NULL , "Flag就在控件里" ) ; if ( handler
) { SendMessage ( handler
, 0x0464 , NULL , NULL ) ; } else { printf ( "no window" ) ; } system ( "pause" ) ; return 0 ;
}
看到一個DES的密鑰 在這個地方看到密文 用一個飄云閣的加解密工具解des即可得到flag
總結
以上是生活随笔 為你收集整理的REVERSE-PRACTICE-BUUCTF-22 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。