本次操作是來源於 ddctf 的一道入門題目!
下載flag.exe
程序並打開分析輸出的有用信息
然後用 ida 32 位打開
在菜單欄上的View
->Open subviews
->Strings
, 或者直接使用快捷鍵Shift+F12
打開Strings
窗口, 一鍵找出所有的字符串(定位中文)
然後找一下flag
字眼
雙擊flag get
字符串進入IDA View-A
圖標架構, 這裏可以查看程序的邏輯樹形圖, 把程序的結構更人性化地顯示出來, 方便我們的分析. 將光標放在.rdata:00413E80
然後選擇Jump
->Jump to xref to operand...
或者快捷鍵Ctrl+X
查看交叉引用
如果對彙編不熟悉, 直接View
->Open subviews
->Generate pseudocode
或者快捷鍵F5
查看僞代碼
分析:
_mm_load_si128
:加載128位值,_mm_store_si128
:存儲128位值strcmp
函數是string compare(字符串比較)的縮寫, 用於比較兩個字符串並根據比較結果返回整數. 基本形式爲strcmp(str1,str2)
, 若str1=str2, 則返回零;若str1<str2, 則返回負數;若str1>str2, 則返回正數.- v9是隨意輸入的值, v5是是函數
xmmword_413E34
賦值的, 所以找到函數xmmword_413E34
的值就可以了.
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v3; // eax
__int128 v5; // [esp+0h] [ebp-44h]
__int64 v6; // [esp+10h] [ebp-34h]
int v7; // [esp+18h] [ebp-2Ch]
__int16 v8; // [esp+1Ch] [ebp-28h]
char v9; // [esp+20h] [ebp-24h]
// 將 xmmword_413E34 函數的值存放在 v5變量
_mm_storeu_si128((__m128i *)&v5, _mm_loadu_si128((const __m128i *)&xmmword_413E34));
v7 = 0;
v6 = qword_413E44;
v8 = 0;
printf("歡迎來到DUTCTF呦\n");
printf("這是一道很可愛很簡單的逆向題呦\n");
printf("輸入flag吧:");
scanf("%s", &v9);
// 比較 v5 和輸入的 v9
v3 = strcmp((const char *)&v5, &v9);
if ( v3 )
v3 = -(v3 < 0) | 1;
if ( v3 )
printf("flag不太對呦,再試試唄,加油呦\n");
else
printf((const char *)&unk_413E90);
system("pause");
return 0;
}
雙擊函數xmmword_413E34
, 可以發現其值後轉成字符串.
ok, 得到 flag, 運行 flag.exe, 將 flag的值輸入即可
最後: 歡迎大家訪問我的博客: https://fengwenhua.top , 雖然博客上面沒啥東西!