題目
做法
下載安裝包,解壓,把解壓后的文件拖進Exeinfo PE進行分析
32位,無殼
扔進IDA(32位),找到main,F5反編譯
只是因為在人群中多看了你一眼——第31行的right flag,關鍵詞找到,我們就從這里開始向上分析
if ( !strncmp(Dest, Str2, v2) )sub_41132F("rigth flag!\n");
如果Dest和Str2的前v2個字符相同,系統會打印一個right flag給我們,sub_41132F不難猜出是print
我們點進Dest和Str2看看有啥東西(Dest沒啥東西,Str2點進去如下,得到Str2的值)
結合上面分析,得出Dest的值(即Str2的值)
往上繼續分析
for ( j = 0; j < v8; ++j )Dest[j] += j;
一個for循環,Dest[0] = Dest[0]+0,Dest[1] = Dest[1]+1 …這般規律為結果生成下去,直到j=v8(該循環對Dest做了變化)
再往上就沒啥了
但是有一個點不清楚它的作用
點進sub_4110BE看看
繼續點進去
遍歷一下
(注:看到第16行的 *3 和第19行的 *4 ,這里就是base64對字符的二進制編碼做的處理(經驗之談),要不確定的話我們可以繼續往下看,這是定義了v9和v10來存放base64對字符的二進制變化;
Base64加密的核心邏輯(分組、補零、填充)必須通過if判斷和循環來實現。下面還有if判斷和while循環還有for循環,至此,我們基本可以判斷本題是Base64加密題)
exp
import base64 #導入模塊
Des = "e3nifIH9b_C@n@dH" #定義目標字符串
flag = "" #初始化結果字符串
for i in range(len(Des)):flag += chr(ord(Des[i]) - i) #Des[i]:取出字符串 Des 中索引為 i 的字符。#ord(Des[i]):使用 ord() 函數獲取()內字符的 ASCII 碼值。#ord(Des[i]) - i:將該 ASCII 碼值減去其索引位置 i。
print(base64.b64decode(flag)) #進行 Base64 解碼并輸出結果
得出結果,’ '里的內容換成flag{}格式提交即可
更新
于2025.4.17