文章目錄
- 1、白給簽到
- 2、Welcome
- 3、Get
- 4、Post
- 5、滴滴滴
- 6、每逢佳節
- 7、Bacon
- 8、古典變奏
- 9、affine
- 10、affine-revenge
- 11、Random_encrypt
- 12、easy_re
- 13、re1
- 14、ez_xor
- 15、maze
- 16、easy_php
- 17、easy_bypass
- 18、Autumn
- 19、easy_Cookie
- 20、[白給] 連上就給flag
- 21、小兔子
- 22、我在城樓觀山景
- 23、Stream
- 24、如來の獸
- 25、PDF
- 26、QR code
- 27、Trytouse
- 28、Boringboss
- 29、esay-RSA
1、白給簽到
直接填入flag即可
2、Welcome
進入題目鏈接地址
右鍵查看源代碼或者Fn+F12
獲得flag
3、Get
使用Get傳入參數henu
使得參數henu=flag即可回顯flag
4、Post
和剛剛的Get幾乎沒有什么區別(注意這里是henu=fl@g,一般可以直接復制),不過這一次是Post傳入參數
Post傳參需要借助插件HackerBar或其他類似的插件,我這里使用的Max HackerBar
右鍵點擊“檢查”,選中Max HackerBar插件
先Load URL,勾選上Post Data,這時候下面會出現Post Data輸入框,將要傳入的參數寫上henu=fl@g,最后點擊Execution(執行),即可獲得flag
5、滴滴滴
打開附件,可以看到很明顯是摩斯電碼
復制摩斯電碼
打開一個在線摩斯電碼轉換器
又根據題目描述是小寫,所以將flag小寫即可
6、每逢佳節
解密字符串以"="號結尾,由大寫英文字母、小寫英文字母和數字組成
base64的特征
1.標準base64只有64個字符(英文大小寫、數字和+、/)以及用作后綴等號;
2.base64是把3個字節變成4個可打印字符,所以base64編碼后的字符串一定能被4整除(不算用作后綴的等號);
3.等號一定用作后綴,且數目一定是0個、1個或2個。這是因為如果原文長度不能被3整除,base64要在后面添加\0湊齊3n位。為了正確還原,添加了幾個\0就加上幾個等號。顯然添加等號的數目只能是0、1或2;
所以推測是base64加密
7、Bacon
得到一個字符串,又由題目名稱得知這題使用的是Bacon密碼
分析字符串可知是由“王果”和“王木”組成
可以將“王果”當作A,“王木”當作B
str1="王果 王果 王木 王木 王果 王果 王木 王木 王木 王果 王果 王木 王木 王木 王果 王果 王果 王果 王木 王木"
str2=""
for i in range(len(str1)):if str1[i]=="果":str2+="A"elif str1[i]=="木":str2+="B"
print(str2)
得到AABBAABBBAABBBAAAABB
(一般如果不行把A和B互換位置,因為不知道王果和王木哪個代表A和B)
打開在線Bacon解密工具
即可獲得flag
8、古典變奏
打開附件發現一串奇怪的字符
由經驗的積累或者題目的提示“小明要去豬圈”得知這是一個豬圈密碼
豬圈密碼在線解密即可得到一個字符串
由題目提示“他上6樓找凱撒”推測這是一個凱撒密碼,經過移六位得到的
凱撒密碼在線解密得到一個字符串
由題目提示“鑰匙就在柵欄下面”推測是柵欄密碼
但是題目沒有給出每組字數,需要自己不斷去嘗試,最后得到一個有含義的字符串,即為flag
9、affine
assert flag==decrypt(cipher,a,b,m)
python assert斷言是聲明其布爾值必須為真的判定
所以flag一定等于cipher使用a,b,m解密后的得到的字符串
分析可知加密和解密都是使用的a,b,m,這題的公鑰和私鑰都是a,b,m,且這題的a,b,m已經明確給出
cipher是flag進行加密后得到的,且cipher已知
那么現在就可以直接通過cipher反解出flag即可
10、affine-revenge
這一題和上面一題唯一的區別就是這一題的鑰匙a,b,m沒有明確給出,需要自己去找
這里我直接使用爆破
11、Random_encrypt
可以看到這里最后的cipher是經過flag隨機使用base64或base32或base16加密十次后得到的結果
(剛開始我任何可以在python代碼中讓隨機解碼十次,但因為base64、base32、base16編碼組成不同base64>base32>base16,base64的編碼幾乎不可以用base16和base32解碼,但base16和base32編碼卻一定可以用base64解碼,所以在進行解碼時候要先判斷它們可能是哪種編碼,再隨機使用該編碼進行解碼,發現這樣難度系數增加),我直接使用人工判斷,進行解碼
Base64:
包含大寫字母(A-Z),小寫字母(a-z),數字(0-9)以及+/;
Base32:
而Base32中只有大寫字母(A-Z)和數字234567;
Base16:
而Base16就是16進制,他的范圍是數字(0-9),字母(ABCDEF);
12、easy_re
拖入exeinfo中查看exe基本信息
可以看到是64可執行文件
拖入64位ida中
flag直接給出了
13、re1
拖入32位ida,找到main函數,F5查看偽代碼
首先我們可以看到代碼的最后的if-else語句會進行v3作為條件進行判斷,如果v3為真,會printf(aFlag_0);否則 printf(aFlagGet);
然后往上看到 v3 = strcmp(v5.m128i_i8, v7);
將輸入的v7和v5進行比較,如果v5不等于v7直接就printf(aFlag_0);(這里就可以判斷出來了真正的flag是aFlag_0,否則aFlagGet輸出過于容易了)
所以v5就顯得格外關鍵了,找跟v5相關的
v5 = _mm_loadu_si128((const __m128i *)&xmmword_413E34);
可以看到_mm_storeu_si128(),對其進行分析發現它類似于memset(),將xmmword_413E34的值賦值給v5,所以,我們可以得到正確的flag應該在xmmword_413E34中,然后,我們雙擊413E34進行跟進
可以看到它的值是十六進制的數,將十六進制的數轉換成字符串(選中之后按R鍵)
注意這里是小端存儲方式,要從后往前讀(其實根據代碼的含義也可以大概判斷出來),flag就出來了
14、ez_xor
拿到ez_xor.exe附件直接丟進PE
可以看到是64位exe文件,丟進ida64
Shift+F12查看字符串(如果是筆記本電腦的話,F12自帶熱鍵,先按Fn,即Fn+Shift+F12)
一般在這里找有沒有和flag相關的字符串,可以看到這里是有的,雙擊進入
找到該字符串,點擊上圖所示,進入main方法
會進入流程圖界面,按空格進入文本界面
可以看到匯編代碼了,按F5(同理如果是筆記本記得按Fn+F5)反匯編,轉換成C語言
現在就可以分析代碼了,這里的C語言可能數據類型之類的會和我們平時的有點不一樣
比如說這里的v3=0i64,0i64表示int64_t類型的0,其實就基本上可以理解為0
這里代碼可以看到關鍵異或代碼while ( (char)(v3 ^ v5[v3]) == dword_403020[v3] )
可以看到該字符串每個字符對應的ASCII碼(這里按R鍵即可看到對應的字符)
現在已知dword_403020和v3(v3就是0~31),逐個進行異或即可得到flag
寫一個Python腳本
s=[0x35, 0x62, 0x37, 0x30, 0x33, 0x3D, 0x60, 0x63, 0x3F, 0x3D, 0x6C,0x69, 0x6D, 0x6F, 0x68, 0x6D, 0x72, 0x77, 0x20, 0x70, 0x76, 0x73,0x72, 0x2F, 0x2E, 0x21, 0x7E, 0x2B, 0x28, 0x25, 0x2C, 0x29]
flag=[0 for i in range(32)] #從給出的代碼很容易看到flag是32位的
for i in range(32):flag[i]=i^s[i]
print(flag)
即可得出flag
15、maze
可以看到是64位可執行文件,拖入64位ida
找到主函數main,F5反匯編查看C語言代碼
int __cdecl main(int argc, const char **argv, const char **envp)
{int result; // eaxchar Str[32]; // [rsp+20h] [rbp-70h] BYREFchar v5[63]; // [rsp+40h] [rbp-50h]char v6; // [rsp+7Fh] [rbp-11h]int v7; // [rsp+84h] [rbp-Ch]int i; // [rsp+88h] [rbp-8h]int v9; // [rsp+8Ch] [rbp-4h]_main(argc, argv, envp);v5[0] = 5;v5[1] = 0;v5[2] = 0;v5[3] = 0;v5[4] = 0;v5[5] = 0;v5[6] = 0;v5[7] = 0;v5[8] = 1;v5[9] = 0;v5[10] = 0;v5[11] = 0;v5[12] = 0;v5[13] = 0;v5[14] = 0;v5[15] = 0;v5[16] = 1;v5[17] = 1;v5[18] = 1;v5[19] = 0;v5[20] = 0;v5[21] = 0;v5[22] = 0;v5[23] = 0;v5[24] = 0;v5[25] = 0;v5[26] = 1;v5[27] = 0;v5[28] = 1;v5[29] = 1;v5[30] = 1;v5[31] = 0;v5[32] = 0;v5[33] = 0;v5[34] = 1;v5[35] = 0;v5[36] = 1;- List itemv5[37] = 0;v5[38] = 1;v5[39] = 0;v5[40] = 0;v5[41] = 0;v5[42] = 1;v5[43] = 0;v5[44] = 1;v5[45] = 0;v5[46] = 1;v5[47] = 0;v5[48] = 0;v5[49] = 0;v5[50] = 1;v5[51] = 1;v5[52] = 1;v5[53] = 0;v5[54] = 1;v5[55] = 0;v5[56] = 0;v5[57] = 0;v5[58] = 0;v5[59] = 0;v5[60] = 0;v5[61] = 0;v5[62] = 1;v6 = 5;v9 = 0;i = 0;printf(Format);scanf("%s", Str);v7 = strlen(Str);if ( v7 == 20 ){for ( i = 0; i <= 19; ++i ){if ( Str[i] == 85 )v9 -= 8;if ( Str[i] == 74 )v9 += 8;if ( Str[i] == 72 )--v9;if ( Str[i] == 75 )++v9;if ( !v5[v9] )break;}if ( v9 == 63 && v6 == 5 )puts("Congratulations!");elseputs("Sorry,your flag is wrong!");system("pause");result = 0;}else{puts("Sorry,your flag is wrong!");system("pause");result = 0;}return result;
}
16、easy_php
提示get不到henu,那get henu試一下
查看源碼
這題考察的是:常見的MD5碰撞:md5值為0e開頭
你需要get傳參,使得參數的md5值和s214587387a的md5值相等,但又不能等于s214587387a
因為0e開頭的md5的原值包括有s214587387a
因此只需要傳遞一個0e開頭的md5的原值即可
17、easy_bypass
他提示說少了一個參數N,那就給他傳一個參數N
看到了include(“flllagggggg.php”)文件包含;
那進去看看吧
得到一串字符有數字0~9和字母A-F組成,所有推測可能是base16編碼
解碼后又得到一串編碼以等號結尾,由大寫字母、小寫字母和數字組成,推測應該是base64
得到flag
18、Autumn
題目提示:愛、死亡和機器人
進入網址
后面都是重復的了,直接關閉dialog,題目多次提示機器人,很容易就讓人想到robots.txt,那進去看看吧
又出現了新的提示,where_is_flag.php
進去看看
除了提示框的內容不一樣和剛開始界面沒有什么不同,現在沒有什么提示信息,查看源碼,一直往下翻,得到flag
19、easy_Cookie
題目各種提示cookie,那么我們就看看cookie里面到底有什么
調用web服務時,參數中=變成%3D
所以這里將%3D換成=
猜測為Base64編碼
解碼后得到
解碼之后發現結果仍然是一串編碼
再次base64解碼即可得到flag
20、[白給] 連上就給flag
根據題目提示nc即可得到flag
在terminal界面
nc 39.103.198.196 10008
ls #顯示當前目錄下文件信息
然后發現里面有個flag
cat flag
即可得到flag
21、小兔子
拿到附件圖片
一般拿到附件圖片,先查看圖片的屬性
很明顯這里的備注有異樣內容,又由文件名和圖片名小兔子,猜測是兔子密碼
解密即可得到flag
22、我在城樓觀山景
打開附件,發現是一堆亂碼
猜測是文件類型錯誤
把文件放入010 Editor中查看文件的真實類型(其實這里通過文件開頭的NG就可以推測出文件的類型是png)
JPEG (jpg),文件頭:FFD8FF
PNG (png),文件頭:89504E47
GIF (gif),文件頭:47494638
ZIP Archive (zip),文件頭:504B0304
RAR Archive (rar),文件頭:52617221
XML (xml),文件頭:3C3F786D6C
HTML (html),文件頭:68746D6C3E
MS Word/Excel (xls.or.doc),文件頭:D0CF11E0
Adobe Acrobat (pdf),文件頭:255044462D312E
ZIP Archive (zip),文件頭:504B0304
RAR Archive (rar),文件頭:52617221
可以看到文件頭為89504E47 ,所以真實類型是png
將文件后綴名改為.png
得到一張這樣的圖片可以看到圖片下方有字樣,就是我們的flag(記得將亮度調到最大)
看不出來也沒有關系,使用看圖工具stegsolve,這次可以清楚地看出flag了
23、Stream
注意看hacker is everywhere
打開附件看到提示說這題需要使用wireshark工具
直接把you_are_hacker.pcapng拖入wireshark中
點擊文件->導出對象->HTTP
保存后,因為hacker is everywhere
我當時隨便打開了一個PHP文件,發現一串長得像Base64編碼的字符,解碼之后就得到了flag
24、如來の獸
打開附件
由附件名稱(Buddha)和經驗推測這是與佛論禪編碼
進入與佛論禪在線解密工具
這里尤其要注意把與佛論禪編碼放在下面輸入框,點擊參悟佛所言的真意!!!!!!
可以看到解密后的編碼是獸語
找到獸語在線解密網址http://hi.pcmoe.net/buddha.html
同樣一定要注意解密輸入框的位置
得到社會主義核心價值觀編碼
在線解碼即可得到flag
25、PDF
題目提示說圖片名有內涵,可以得到圖片下面有內容
打開pdf后,Ctrl+A獲得了圖片下面的字符,Ctrl+C復制字符內容
新建一個txt文檔,Ctrl+V
并沒有見過這個編碼
進入Google搜索
OK,可以看到是陰陽怪氣編碼
在網上搜索到一個在線解密工具https://mmdjiji.gitee.io/yygq.js/
得到flag
26、QR code
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-SYad2ou0-1637033025190)(C:\Users\張開斌\AppData\Roaming\Typora\typora-user-images\image-20211115085102106.png)]
題目是直接丟過來一個二維碼,缺少二維碼定位符,所以搜素一下二維碼定位符
截取圖片,去除白色背景
(這一題用PowerPoint更簡單容易)
首先將兩張圖片都打開
將頁面切換到定位符
選中左側工具欄的移動工具(就是最上面的第一個工具)
然后點擊圖片,拖動圖片到上圖中QRcode.png的位置
這樣定位符圖片就會出現在QRcede圖片上了
調整圖片的大小和位置(每弄好一個記得選擇右上角的對號)
最后這就是生成的二維碼了
掃描二維碼
得到一串符號
++++++++[>>++>++++>++++++>++++++++>++++++++++>++++++++++++>++++++++++++++>++++++++++++++++>++++++++++++++++++>++++++++++++++++++++>++++++++++++++++++++++>++++++++++++++++++++++++>++++++++++++++++++++++++++>++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++<<<<<<<<<<<<<<<<-]>>>>>>>>–.<+.>+.<+++.>.-.<+++.—.—.>—.<.>–.
很明顯這是密碼
是brainfuck密碼
在線工具解碼即可得到flag
27、Trytouse
推測該題目是考察寂靜之眼的使用
下載附件拖入寂靜之眼
點擊Decode
再次點擊Decode
即可獲得flag
28、Boringboss
由中 由中 由由 由由 由由 由由 由中 由中 由中 由由 由中 由由 由中 由由 由由 由由 由由 由由 由由 由中 由中 由由 由中 由由 由由 由中 由中 由由 由由 由由 由由 由中 由由 由由 由由 由中 由由 由由 由中 由中
打開附件看到一個很長的字符串
易得該字符串是由”由中“和”由由“組成的
將“由中”記作A,“由由”記作B(如果這樣不行的話,則將“由中”記作B,“由由”記作A)
str1="由中 由中 由由 由由 由由 由由 由中 由中 由中 由由 由中 由由 由中 由由 由由 由由 由由 由由 由由 由中 由中 由由 由中 由由 由由 由中 由中 由由 由由 由由 由由 由中 由由 由由 由由 由中 由由 由由 由中 由中"
str2=""
i=1
while i<len(str1):if str1[i]=="中":str2+="A"elif str1[i]=="由":str2+="B"i+=3
print(str2)
得到AABBBBAAABABABBBBBBAABABBAABBBBABBBABBAA
Bacon在線解密后得到hrllhxm,提交后發現錯誤
將A,B互換
得到BBAAAABBBABABAAAAAABBABAABBAAAABAAABAABB
在線解密得到flag
29、esay-RSA
題目代碼如下
更改后的主要代碼
from gmpy2 import *
from Crypto.Util.number import *e = 0x10001def gcd(a, b):if a % b == 0:return belse:return gcd(b, a % b)def generate_key(bits):p, q = getPrime(bits), getPrime(bits)phi = (p-1)*(q-1)assert gcd(e, phi) == 1return p+q, (e, p*q)def ext_gcd(a, b):if b == 0:return 1, 0, aelse:x, y, gcd = ext_gcd(b, a % b) # 遞歸直至余數等于0(需多遞歸一層用來判斷)x, y = y, (x - (a // b) * y) # 輾轉相除法反向推導每層a、b的因子使得gcd(a,b)=ax+by成立return x, y, gcddef encrypt(msg, e, n):m = bytes_to_long(msg)return pow(m, e,n)def decrypt(msg, d, n):return pow(msg,d,n)def computeD(T, e):(x, y, r) = ext_gcd(T, e)#y maybe < 0, so convert itif y < 0:return T + yreturn ycipher = 3721706087701608031528143109887388627081325867064279646928798190372280395374522547064987799846969351893973138918258025444740621243876030264735011810425237
hint = 180542641103954693101505542753644053708448862377824438761565169103024337070352
N = 7963808967283558001727298271915511262219384674243538198387664984329127461321716628344351467966478566815452787078495773626878495336572392243183878207924327
T = N-hint+1 # 這是這一題的關鍵,要通過T計算秘鑰 (p-1)*(q-1)=T
E = 65537
D = computeD(T, E)
flag = decrypt(cipher, D, N)
flag = long_to_bytes(flag)
print(flag)
這題明文已知,公鑰(N,E)已知
通過hint和N可以求出T
再通過DE mod T=1計算出密鑰D(要使用擴展歐幾里得)
然后用私鑰解密,即可求出密文
但注意要long_to_bytes!