生活随笔
收集整理的這篇文章主要介紹了
REVERSE-PRACTICE-BUUCTF-32
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
REVERSE-PRACTICE-BUUCTF-32 [第四章 CTF之APK章]數字殼的傳說 [第五章 CTF之RE章]Hello, RE [第五章 CTF之RE章]BabyAlgorithm [第五章 CTF之RE章]BabyConst [第五章 CTF之RE章]BabyLib [第五章 CTF之RE章]easy_rust [第五章 CTF之RE章]easy_go [第五章 CTF之RE章]easy_mfc
[第四章 CTF之APK章]數字殼的傳說
查殼,360加固 用frida腳本脫殼后,jadx-gui分析得到的dex文件 輸入作為明文,輸入的前6個字符作為密鑰,字符串"123456"作為iv 對輸入進行AES.CBC加密,得到的密文經base64編碼后與已知的base64字符串比較 分析AESUtils這個類 第19行把密鑰擴展成長度為32的字符串,不足的補空格" " 第37行把iv擴展成長度為16的字符串,不足的補空格" " 密鑰為輸入的前6個字符,猜測是"N1BOOK"或者"n1book" python解AES.CBC,當密鑰為"n1book"時,解出flag
from Crypto
. Cipher
import AES
import base64
cipher
= "u0uYYmh4yRpPIT/zSP7EL/MOCliVoVLt3gHcrXDymLc="
cipher_str
= base64
. b64decode
( cipher
)
key_str
= "n1book"
key_str
= key_str
. ljust
( 32 , " " )
iv_str
= "123456"
iv_str
= iv_str
. ljust
( 16 , " " )
aes
= AES
. new
( key_str
, AES
. MODE_CBC
, iv_str
)
print ( aes
. decrypt
( cipher_str
) )
[第五章 CTF之RE章]Hello, RE
exe程序,ida打開后,在main函數中找到flag
[第五章 CTF之RE章]BabyAlgorithm
elf文件,ida打開 main函數中,讀取輸入,驗證輸入長度是否為45,然后設置密鑰,對輸入進行RC4加密,得到的密文與已知的v8比較 已知密鑰為"Nu1Lctf233",密文為v8,解RC4即可得到flag
# include <stdio.h>
void rc4_init ( unsigned char * s
, unsigned char * key
, unsigned long Len_k
)
{ int i
= 0 , j
= 0 ; char k
[ 256 ] = { 0 } ; unsigned char tmp
= 0 ; for ( i
= 0 ; i
< 256 ; i
++ ) { s
[ i
] = i
; k
[ i
] = key
[ i
% Len_k
] ; } for ( i
= 0 ; i
< 256 ; i
++ ) { j
= ( j
+ s
[ i
] + k
[ i
] ) % 256 ; tmp
= s
[ i
] ; s
[ i
] = s
[ j
] ; s
[ j
] = tmp
; }
}
void rc4_crypt ( unsigned char * Data
, unsigned long Len_D
, unsigned char * key
, unsigned long Len_k
)
{ unsigned char s
[ 256 ] ; rc4_init ( s
, key
, Len_k
) ; int i
= 0 , j
= 0 , t
= 0 ; unsigned long k
= 0 ; unsigned char tmp
; for ( k
= 0 ; k
< Len_D
; k
++ ) { i
= ( i
+ 1 ) % 256 ; j
= ( j
+ s
[ i
] ) % 256 ; tmp
= s
[ i
] ; s
[ i
] = s
[ j
] ; s
[ j
] = tmp
; t
= ( s
[ i
] + s
[ j
] ) % 256 ; Data
[ k
] = Data
[ k
] ^ s
[ t
] ; }
}
void main ( )
{ unsigned char key
[ ] = "Nu1Lctf233" ; unsigned long key_len
= sizeof ( key
) - 1 ; unsigned char data
[ ] = { 0xC6 , 0x21 , 0xCA , 0xBF , 0x51 , 0x43 , 0x37 , 0x31 , 0x75 , 0xE4 , 0x8E , 0xC0 , 0x54 , 0x6F , 0x8F , 0xEE , 0xF8 , 0x5A , 0xA2 , 0xC1 , 0xEB , 0xA5 , 0x34 , 0x6D , 0x71 , 0x55 , 0x08 , 0x07 , 0xB2 , 0xA8 , 0x2F , 0xF4 , 0x51 , 0x8E , 0x0C , 0xCC , 0x33 , 0x53 , 0x31 , 0x00 , 0x40 , 0xD6 , 0xCA , 0xEC , 0xD4 } ; rc4_crypt ( data
, sizeof ( data
) , key
, key_len
) ; for ( int i
= 0 ; i
< sizeof ( data
) ; i
++ ) { printf ( "%c" , data
[ i
] ) ; } printf ( "\n" ) ; return ;
}
[第五章 CTF之RE章]BabyConst
elf文件,ida打開 main函數中,輸入的長度為48,每四個一組,共12組,經過變換后與已知比較 可以看到每組的四個字符經變換后變成了一組包含16字節的數據,即16*8==128bit的數據 往下看sub_40085B函數,a1[2]~a1[5]分別設置成0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476 于是可以猜到是md5算法,這四個值是標準的幻數 參考:MD5算法原理及其實現 最后在md5這個網站解md5,每組解完拼接起來就是flag
arr
= [ 0x39 , 0x6D , 0xF0 , 0xD2 , 0x42 , 0x41 , 0xF8 , 0x02 , 0x16 , 0x7A , 0xDC , 0xC0 , 0xD6 , 0x10 , 0x6E , 0xD3 , 0xFE , 0x68 , 0x6F , 0x27 , 0xE9 , 0x00 , 0x81 , 0x6B , 0xB2 , 0xB8 , 0xBC , 0x63 , 0xD7 , 0x0D , 0x40 , 0x08 , 0xD2 , 0xCD , 0xB7 , 0x10 , 0x60 , 0x4D , 0x69 , 0x64 , 0xA8 , 0x36 , 0x25 , 0x54 , 0xF7 , 0xDE , 0xF0 , 0x96 , 0xDF , 0xC4 , 0xF8 , 0x47 , 0xAC , 0xDE , 0x92 , 0xAC , 0x23 , 0xC4 , 0x69 , 0x4B , 0xEF , 0x32 , 0x50 , 0x28 , 0x46 , 0x82 , 0xA2 , 0x4D , 0x59 , 0xA9 , 0x8E , 0x7A , 0x66 , 0xD8 , 0xE0 , 0xD3 , 0x1F , 0xD9 , 0xBD , 0x68 , 0x46 , 0x04 , 0xF6 , 0x12 , 0xD8 , 0xA7 , 0x1D , 0xEB , 0x0D , 0xFA , 0x03 , 0x5E , 0x3F , 0x06 , 0xA5 , 0x9B , 0x99 , 0xAA , 0x58 , 0x66 , 0x28 , 0xD9 , 0x70 , 0x72 , 0x73 , 0x28 , 0x6B , 0x4C , 0x87 , 0x32 , 0xDC , 0xFF , 0xA6 , 0xC9 , 0xFE , 0x07 , 0x74 , 0x20 , 0xE1 , 0xDE , 0xFD , 0xD7 , 0xC8 , 0x7B , 0x59 , 0xCD , 0x1D , 0x73 , 0xCB , 0x7F , 0x25 , 0x22 , 0xCC , 0x3D , 0xF2 , 0x0F , 0xF2 , 0x98 , 0x7E , 0x98 , 0x42 , 0x7F , 0x05 , 0xD2 , 0xBE , 0x57 , 0x03 , 0xDD , 0x22 , 0xDD , 0xC3 , 0x18 , 0xEA , 0x07 , 0x24 , 0x80 , 0x44 , 0xD7 , 0xEC , 0xCC , 0xFF , 0xF5 , 0x6B , 0xC4 , 0x60 , 0x70 , 0xDA , 0xE9 , 0xF9 , 0x46 , 0x6C , 0x11 , 0x76 , 0x5D , 0x0C , 0x21 , 0x0E , 0x49 , 0x91 , 0xA0 , 0x2A , 0x04 , 0xE4 , 0x21 , 0x84 , 0x9F , 0x2A , 0xB8 , 0x9B , 0x7D , 0x9E , 0xEA ]
for i
in range ( 0 , len ( arr
) , 16 ) : s
= "" for j
in range ( 16 ) : s
+= hex ( arr
[ i
+ j
] ) . zfill
( 4 ) . replace
( "0x" , "" ) print ( s
)
[第五章 CTF之RE章]BabyLib
elf文件,ida打開 交叉引用字符串"Input flag:"來到主邏輯函數 可以看到存在非常大的整數,而且65537很令人在意 RSA的題目做多了就會有感覺,65537通常是作為逆向題目中RSA的指數e,其他的大整數就分別是p,q和c 解RSA即可得到flag
import gmpy2
from Crypto
. Util
. number
import long_to_bytes
p
= 9842210544704105105386460208892325341518023212707647450607909247791133264519200579173177912467785842558060968492186761162106356089009194470097546296829163
q
= 12972360952153818155692381381571252126631475184728971905301445264084096070607651598626783223094292740492828654265391639843199875189333033337169565006624907
n
= p
* q
e
= 65537
c
= 110694010334901653238216140152683772418101197298114114481381418739511015861349388028360214495059500357527716613334520805339266807313669925649167175211788624655809951516502907329949137499677877779584898365309802983718066683849944838484002656376845311375573423677826690834875095904482448693671735053088583663382
phin
= ( p
- 1 ) * ( q
- 1 )
d
= gmpy2
. invert
( e
, phin
)
m
= gmpy2
. powmod
( c
, d
, n
)
print ( long_to_bytes
( m
) )
[第五章 CTF之RE章]easy_rust
rust語言,調試 變表base64,在這個地方找到變表 然后main函數中的第46行的cmp的第二個參數指向的是密文字符串 密文字符串,實際上在上面找到變表的那個位置,在"Input your flag:\n"與"Failed to read lineTrue!\nFalse!\n"之間就是密文字符串 解變表base64,第一個等號"=“隔斷了flag的兩個部分,最后的”=MlW"沒有用 拼接起來,中間加個"_",最后加上"}",于是flag為n1book{9o0d_j0b}
[第五章 CTF之RE章]easy_go
go語言,調試 輸入的包絡為"n1book{}",輸入的總長度為21 比較驗證在第79行的if語句 邏輯為:byte_561538[i] + byte_561518[i] * input[i] == byte_561528[i] 每個參與運算的整型都是8bit,寫腳本時要注意截斷
arr_18
= [ 0xD3 , 0x75 , 0x9B , 0xF9 , 0xA3 , 0x87 , 0xED , 0x93 , 0x8D , 0xDD , 0x77 , 0xED , 0x67 , 0x00 , 0x00 , 0x00 ]
arr_28
= [ 0xB7 , 0x9C , 0x79 , 0x43 , 0x9B , 0xAF , 0x94 , 0xE4 , 0x94 , 0x71 , 0xEC , 0xEA , 0x8E , 0x00 , 0x00 , 0x00 ]
arr_38
= [ 0xDB , 0x9E , 0xB7 , 0x9A , 0x91 , 0xCA , 0xA1 , 0x6B , 0x97 , 0xC1 , 0x74 , 0xB3 , 0x90 , 0x00 , 0x00 , 0x00 ]
flag
= ""
for i
in range ( 13 ) : for j
in range ( 32 , 128 ) : if arr_28
[ i
] == ( arr_38
[ i
] + ( arr_18
[ i
] * j
) & 0xff ) & 0xff : flag
+= chr ( j
)
print ( "n1book{" + flag
+ "}" )
[第五章 CTF之RE章]easy_mfc
mfc的exe,用xspy找到一個函數 “OnCommand: notifycode=0000 id=0001,func= 0x00C61880(easy_mfc.exe+ 0x001880 )” ida打開,去找偏移為"0x1880"的函數,讀取輸入,然后驗證 進入sub_401910函數,可以看到,輸入與v7循環異或,結果與v5比較 寫逆異或腳本即可得到flag
v7
= [ 0xBC , 0x9D , 0x8C , 0x92 , 0x40 , 0x47 , 0x86 , 0x21 , 0xF5 , 0xAC , 0x8F , 0xFD , 0x68 , 0xE4 , 0xE9 , 0x3A , 0xC0 , 0x66 , 0xB3 , 0x64 , 0x7E , 0x79 , 0xD3 , 0x22 , 0x31 , 0xF8 ]
v5
= [ 0xD2 , 0xAC , 0xEE , 0xFD , 0x2F , 0x2C , 0xFD , 0x79 , 0xC5 , 0xDE , 0xD0 , 0x85 , 0x58 , 0xB6 , 0xB6 , 0x0B , 0xF5 , 0x39 , 0xC0 , 0x54 , 0x21 , 0x1F , 0xE2 , 0x54 , 0x02 , 0x85 ]
flag
= ""
for i
in range ( len ( v7
) ) : flag
+= chr ( v7
[ i
] ^ v5
[ i
] )
print ( flag
)
創作挑戰賽 新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔 為你收集整理的REVERSE-PRACTICE-BUUCTF-32 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。