0x1. 進入環境,下載下傳附件
題目給出了一個exe檔案,打開運作後,效果如圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SO4gDO3ImMzcTM3gDM1ITNzYzXxUTN1UTMxIzLcBTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
0x2. 問題分析
0x2_1. 檢查是否套殼
使用exeinfo PE打開檔案,如圖:
沒有任何套殼。
0x2_2. 使用IDA分析
将程式丢入IDA中,搜尋main函數,F5反編譯得到僞代碼,如圖:
針對重點代碼進行分析:
BOOL __stdcall DialogFunc(HWND hDlg, UINT a2, WPARAM a3, LPARAM a4)
{
if ( strstr(&String, "@") && strstr(&String, ".") && strstr(&String, ".")[1] && strstr(&String, "@")[1] != 46 ) // 判斷使用者輸入的郵箱格式是否正确
{
v28 = xmmword_410AA0; // 輕按兩下變量,變成字元可以看到 'iaf noitartsigeR'
v29 = 1701999980;
*(_OWORD *)Src = xmmword_410A90; // 'cuS noitartsigeR'
v30 = 46;
v26 = xmmword_410A80; // galf ruoY !ssec
v27 = 3830633;
if ( strlen(v11) != 16 // 前文定義v11是4位字元,但是此處是需要v11長度為16
|| v11[0] != 'C'
|| v23 != 88
|| v11[1] != 'Z'
|| v11[1] + v22 != 155
|| v11[2] != '9'
|| v11[2] + v21 != 155
|| v11[3] != 'd'
|| v20 != '7'
|| v12 != 'm'
|| v19 != 'G'
|| v13 != 'q'
|| v13 + v18 != 170
|| v14 != '4'
|| v17 != 'g'
|| v15 != 'c'
|| v16 != '8' )
{
strcpy_s(&Text, 0x100u, (const char *)&v28); // 如果上述條件滿足,則v28變量的内容送到提示框
}
else
{
strcpy_s(&Text, 0x100u, Src); // 将src提示資訊送入提示框
strcat_s(&Text, 0x100u, v11); // 再将v11的資訊粘貼到src後面
}
}
else
{
strcpy_s(&Text, 0x100u, "Your E-mail address in not valid.");
}
MessageBoxA(hDlg, &Text, "Registeration", 0x40u); // 傳回彈框對象
return 1;
}
這裡很迷糊的一點就是,明明前面定義v11是char類型的4位長度,結果if語句中判斷要求是11位,那麼到底是多少?我們輕按兩下一下v12變量,看看存放的位址,如圖:
var240位址是v11,存放4個位址位後,v12放在的var23C位置,那麼相當于輸入多餘的内容會放入後續的,v12,v13,v14…等位址位置,這樣看就一目了然了,将if的内容轉換成字元:
v11分别為:CZ9d
v12-v20分别為:mq4c8g9G7bAX