• XCTF-re1


    啊呀,第一次写writeup!!!一个小尝试!

    本道题针对于xctf攻防世界的新手逆向题re1

    首先,我们把附件下载下来,发现是一个可执行程序。呃,其实最开始是要查有没有壳的,但是把这个拖入IDA后,发现可以找到main函数,也就知道它没有壳啦,不过谨慎点,可以用PEID来进行有无壳的判断。

    先直接运行一下下载来的可执行文件,发现

    然后,拖入IDA(32)后,F5反编译找到main主体函数

    在这里,我们可以大概看一下主程序的执行过程,一开始看到这个main里的内容的时候,其实脑子一片空白,后来使用Shift+F12查看字符串

    发现有个关键字flag get,于是我们点进去

    就可以知道执行到unk_413E90处,那么flag就获得成功啦,再去看下主函数,发现,只要后一个if里v3=0,就可以啦

    然后再继续往上想,v3怎样才能=0呢,我们来仔细分析下过程(把源码放这啦)

    *************************************************************************************************************

    _mm_storeu_si128((__m128i *)&v5, _mm_loadu_si128((const __m128i *)&xmmword_413E34));
    v7 = 0;
    v6 = qword_413E44;
    v8 = 0;
    printf(&byte_413E4C);
    printf(&byte_413E60);
    printf(&byte_413E80);
    scanf("%s", &v9);
    v3 = strcmp((const char *)&v5, &v9);
    if ( v3 )
    v3 = -(v3 < 0) | 1;
    if ( v3 )
    printf(aFlag);
    else
    printf((const char *)&unk_413E90);

    *************************************************************************************************************

    在这里出现了_mm_storeu_si128()与 _mm_loadu_si128()

    前者的函数原型:void _mm_store_si128 ( __m128i *p, __m128i a);

    功能就是把__m128i 变量a的值存储到p所指定的变量中去;

    后者的函数原型:

    __m128i _mm_loadu_si128(__128i *p)

    功能就是返回P变量中的值

    所以_mm_storeu_si128((__m128i *)&v5, _mm_loadu_si128((const __m128i *)&xmmword_413E34))指令就是把xmmword_413E34的值赋给v5

    之后,我们要特别注意‘|’这个二进制按位操作符,也就是说进行或运算,但由于v3 = -(v3 < 0) | 1  ,故只要v3=strcmp((const char *)&v5, &v9)的值不是0,那么无论v3是否小于0大于0,进行或运算的结果都不会是0,因此,可以直接忽略这个,于是我们就知道了,只要字符串v5和我们输入的字符串v9完全相同,那么就会有printf((const char *)&unk_413E90);,故我们就知道flag其实也就是字符串v5。

    进去xmmword_413E34

    我们可以发现xmmword的值就是3074656D30633165577B465443545544h(h代表是用16进制表示),然而其实它的值还不是这个,放入16进制转ASCII,发现得到0tem0c1eW{FTCTUD,呀,这个一看就很奇怪,发现它倒着读DUTCTF{We1c0met0还差不多,不过确实是这样的,因为涉及到了大小端顺序的转换,呃,为什么会有大端小端的问题,我其实也不大懂,我只知道网络字节序是大端(高位字节排放在内存低地址端,低位字节排放在内存高地址端),主机字节序是小端(与大端相反)。

    一开始我以为输入这个,flag 就会出现,后来我发现我错了,还是显示错误,之后,我又尝试了许久,发现,我漏掉了qword_413E44    dq 7D465443545544h !!! 把它再进行转换后,}FTCTUD,反过来也就是DUTCTF},啊啊啊,这才看着像答案!!!

    然后我们把DUTCTF{We1c0met0DUTCTF}放入可执行文件试试

    Oh!!!我的天哪,看来它就是我们心心念念的flag啦

    提交flag 后,我看了其他人写的writeup ,发现有一个好有用的小技巧哦!

    那就是:

    在相应16进制数处按R键可以自动转化为字符,有了它,就不用去在线转字符啦

    还有就是用记事本打开的话,就直接能找到flag,噢,如此简单直接。这道题自己花了一个多小时做出来,虽然它好像很简单,但我,好开心!!!!!!!!!!!!!因为这是自己第一次独立解出的逆向题!!!!!

    这道题还能用OllyDebug来解,步骤更简单,当然,我是看了大佬的writeup啦

    第一次写writeup ,多多包涵,肯定有解释有误的地方或者是不到位的地方,希望谅解!!!如有不正确的地方,也欢迎指出!!!

  • 相关阅读:
    原型链与析构函数
    django篇-路由系统介绍
    mvc与mtv
    模板初探
    安装和创建django项目
    一分钟学会定时删除日志的 Shell 脚本
    svn其中一种备份方式svnsync
    mysql企业实战(二)之主从复制,读写分离,双主,以及高可用
    mysql企业实战(一)
    nginx详解
  • 原文地址:https://www.cnblogs.com/jane315/p/12713222.html
Copyright © 2020-2023  润新知