美文网首页
一个有意思的ctf题目

一个有意思的ctf题目

作者: 看点书 | 来源:发表于2018-05-24 19:59 被阅读0次

    步骤如下

    1.这个题目是迄今遇到的最坑题目。话不多说,上题目。链接:http://pan.baidu.com/s/1hr5CtpU 密码:r9wi

    2.首先运行题目,如下图所示,跟平常的题目没什么两样。随便输入字符串,发现弹出报错信息。咋一看,有关键字符串,好咧,这题不难,肯定可以找到关键挑战,然后问题就简单了。(太天真。。。)

    image

    3 打开OD载入程序,搜索字符串,发现关键字符串,很高兴。

    image

    在字符串上方发现两个跳转都跳到失败处,猜想应该是二次验证,一个一个分析,分析第一个call crackme.00402e40 ,发现是对输入的字符串进行一系列处理,然后得到一个数值,在下面语句中发现是和0x92381221 进行比较。不等则跳转向失败,打开IDA,分析关键call ,发现0x92381221代表的十进制数2453148193刚好符合条件,心中顿感,我实在是太聪明了。

    image

    继续往下看下一个跳转,call crackme.00401DF0,发现是两个字符串比较,猜想是我们前面的字符串进行再次的运算得到一堆字符串然后比较,然后分析可得处理函数为call crackme.00401990,分析关键call 发现是把输入进行MD5运算得到的一堆字符串。沃日。。。这控制不了啊。。。然后感觉不太对,于是我尝试暴力把跳转改一下,看会出现什么情况。发现既弹出了成功,又弹出来失败,感觉不对。

    4.想着对消息框下个断点,F9运行,点击工具栏的W发现,竟然出现了两个输入Input,觉得肯定玄机在此,觉得其中一个按钮一定是被隐藏了,在command 位置下断点,输入 bp ShowWindow,寻找ShowWindow函数,重新运行程序,发现运行到了用户层,alt+f9运行出来,发现前面就是ShowWindow 窗口在此下断点,删除刚刚下的user32里的断点,发现参数信息为0时,为隐藏,为1时为显现,于是更改参数值如下图所示:

    image

    复制到可执行文件,保存文件。再次运行发现果然出现了两个输入按钮。

    5.修改后的程序重新加载进OD,此时发现感觉没什么思路,对获取输入字符串的函数进行下断点,在IDA中发现有GetWindowText函数,双加该函数,ctrl+x 获取其引用的位置,记下地址,在OD中ctrl+g 查找,找到该函数位置下断点,重新运行程序,输入字符串,点击左边的Input,程序运行到断点处,F8单步运行,发现下面有一个call ,F7进去看看,发现是获取字符串的长度,感觉好多Crackme都会对字符串的长度进行检查,于是对存字符串的位置下一个内存访问断点,看看是否有什么意外的惊喜,F9运行程序,发现程序到了这,IDA查看此位置的反编译结果,发现果然是对字符串的长度进行了检查,0x27u说明字符串长度为39,79,79,67,84,70,123,125刚好是题目所说的格式00CTF{},继续运行寻找返回的地方。最后回到401f96的位置,此处果然为一个调用,检查长度和格式。如果不符合返回值为0,跳到失败的位置。符合的话返回值为1,继续往下进行。

    image image

    6 继续往下分析,分析各个call 的作用,发现call 1.00401860 位置的call 有很大的嫌疑,里面有各种循环,猜测为算法处理过程,IDA定位此处位置分析基本确定此位置,继续向下运行,查找字符串比较的过程,发现地址为401fca的调用,是弹出错错误的位置,此处下断点,重新运行程序到这个位置,F7进去分析,同时打开IDA,定位此函数,辅助分析,果然发现了两个MessageBOXA函数。分析不同的弹框结果发现前面是一个字符串比较函数,IDA按table键定位此函数的位置。

    image

    进去发现是一个一个进行字符的比较,比较字符串b5h760h64R867618bBwB48BrW92H4w5r 错误的话最后函数返回值为1,弹出错误对话框。

    7.现在的问题就只剩下解决算法出路的问题了。IDA反编译出的代码如下

    image

    分析可知其对数字不做变换,大写字母减去65然后再进行关键操作,
    V9=(V6+V5V7)%26+((V6+V5V7)%26<0?0X1a:0)
    v6在调试的时候会出现32-2-2=28,v5情况有点复杂,可能是3或者5,待会再说为什么,小写字母减去97然后进行关键操作,这样就进行了字符串的变换。
    关于v6的问题:该数值最早是函数0041458e 的返回值,返回值为-1的时候就赋值为3,否则为原数。我用3进行测试的时候发现是错误的,那这个函数0041458e 就很有问题。
    在此处下断点,F7进去发现是再次调用了函数41459c,继续跟进去同时观察IDA的结果,

    image

    发现其实就是判断_mbschr((const unsigned __int8 *)(a3 + *(_DWORD *)this),a2))的结果,点击该函数进去,OD定位该位置,单步运行会发现,其实是检查输入字符串的第六位是否为0,如果为0则返回 值为0的地址,后面是字符串的地址减去该地址为5,即为v6,否则的话返回值为-1,在后面的判断中赋值为3.此为v6的具体赋值过程。

    image

    相关文章

      网友评论

          本文标题:一个有意思的ctf题目

          本文链接:https://www.haomeiwen.com/subject/urqejftx.html