本次操作是来源于 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/index.php/archives/11/
转载时须注明出处及本声明