从一道非常简单的题目开始了解 IDA

叁歲伎倆 2023-07-05 11:48 112阅读 0赞

flag.exe

本次操作是来源于 ddctf 的一道入门题目!

下载flag.exe程序并打开分析输出的有用信息

format_png

然后用 ida 32 位打开

format_png 1

format_png 2

format_png 3

在菜单栏上的View->Open subviews->Strings, 或者直接使用快捷键Shift+F12打开Strings窗口, 一键找出所有的字符串(定位中文)

format_png 4

format_png 5

然后找一下flag字眼

format_png 6

双击flag get字符串进入IDA View-A图标架构, 这里可以查看程序的逻辑树形图, 把程序的结构更人性化地显示出来, 方便我们的分析. 将光标放在.rdata:00413E80

format_png 7

然后选择Jump->Jump to xref to operand... 或者快捷键Ctrl+X查看交叉引用

format_png 8

format_png 9

format_png 10

如果对汇编不熟悉, 直接View->Open subviews->Generate pseudocode或者快捷键F5查看伪代码

format_png 11

format_png 12

分析:

  • _mm_load_si128:加载128位值, _mm_store_si128:存储128位值
  • strcmp函数是string compare(字符串比较)的缩写, 用于比较两个字符串并根据比较结果返回整数. 基本形式为strcmp(str1,str2), 若str1=str2, 则返回零;若str1str2, 则返回正数.
  • 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 )

    1. v3 = -(v3 < 0) | 1;

    if ( v3 )

    1. printf("flag不太对呦,再试试呗,加油呦\n");

    else

    1. printf((const char *)&unk_413E90);

    system(“pause”);
    return 0;
    }

双击函数xmmword_413E34, 可以发现其值后转成字符串.

format_png 13

format_png 14

format_png 15

format_png 16

ok, 得到 flag, 运行 flag.exe, 将 flag的值输入即可

format_png 17
最后: 欢迎大家访问我的博客: https://fengwenhua.top , 虽然博客上面没啥东西!

发表评论

表情:
评论列表 (有 0 条评论,112人围观)

还没有评论,来说两句吧...

相关阅读

    相关 一道编程题目

    昨天在微信群看到有人在讨论一个问题, 具体题目如下: 入参两个Intger,返回空,然后使这个两个值在调用函数后交换。打印交换后的值,比如你初始化两个变量a和b对应的值

    相关 一道非常简单Java面试题

    今天跟大家谈一谈并发编程中,大厂面试官经常会问的一个最简单的问题:“非公平锁和公平锁有什么区别?” 看完第一眼,是不是很简单? 很多人张口就回答:“随机访问”、“插队访问”