XCTF-game

作者: 雁落衡阳 | 来源:发表于2019-04-27 17:10 被阅读0次

今天在做XCTF的题目的时候遇到了game这个题目,先让它运行

运行界面

之后暂停,发现停到了这里。

运行的过程中按下f12

之后按下f8竟然和f9效果一样,都是一直执行,像嚼了炫迈停不下来,f7单步步入,alt+f9都没用,这个程序就没有暂停过。

炫迈.jpg

   那就不动态分析了,尝试静态分析。od看到程序基址在50000。

基址

   ida进行基址重定位

rebase

对比重定位之后相同位置的指令,发现相同。说明基址设置正确。

对比相同位置指令

直接在ida中alt+t搜索字符串'flag',但是发现flag出现的次数太多。
于是再复习一下pe的区块(图来自《加密与解密》,看雪的):

常见区块2

ida ctrl+s选择跳转的segment,跳转到.rdata

rdata

再搜索flag发现找到了:

'flag'

查找交叉引用,找到引用位置。
找到了引用位置之后发现,在od重新加载设断点没有用啊,说是没有那个内存地址,看来这个程序内存基址是变的,应该是开了aslr保护了,emmmm,看来刚刚设置基址是白设置了。

电脑应该是有办法关闭aslr保护的,我先静态分析一波吧

静态分析

这个显示的是应该是程序类似于printf或者scanf之类的函数吧,但是不知道ida为什么没有识别出来。

刚刚蠢了,那个done!!!的位置直接反编译就差不多得到答案了

反编译

程序已经为这数组赋值了,上面就是一个加密算法

程序赋的初值

看起来是要写一个脚本解密了。
但是现在看了一下之前引用这个函数的函数

上一个函数

我想是不是可以直接在这里做文章

打补丁

emm,直接改了汇编代码,试试这样行不行,直接输入0,让它restart关闭全部lamp

直接输入0 直接出结果

看来是直接给程序打补丁就出来了。

如果真的阅读代码得到顺序,或者编写解密脚本可能就会费些劲了。还有一种我认为比较巧妙的办法是改eip,尝试改eip直接让程序输出done!!后面的内容,但是我操作的时候程序死掉了,不知道是不是开保护的问题。

那其实从这个题里面还能学到什么呢,应该再看看怎么给电脑关闭aslr保护,这样就算程序设置了aslr都无法地址随机化。至于具体的方法,之后再更新文章的时候再说。然后改eip程序为什么会死掉呢,应该再查查,暂时认为的可能有两种:
1.开了保护
2.没有维护好堆栈平衡

刚刚又看了看程序,发现有一个函数调用 j___RTC_CheckEsp,网上说:

调试的时候编译机自己加入的,发布版本会过滤掉此函数功能就是检查堆栈平衡

也就是说因为堆栈不平衡才出现这种问题的吗。

这次调试的时候有些奇怪,感觉和调试平常的程序有些区别,比如调试的时候不能断在我想断的地方,然后调用函数好多都是call一个函数,然后call之后的那个位置jmp到了函数体里才执行的。。。

我猜这个程序有可能涉及到了一些反调试的知识,或者这个程序不是用我所熟悉的语言写的,先给一个地址在搜索资料的时候看到的,还没仔细看,在这里mark下

https://bbs.pediy.com/thread-79205.htm

之后我用peid查了下

peid

看来这个还真的是debug版本,而且是vc++8.0编写的。

刚才又看见了一个介绍保护的选项的文章,再mark下
https://blog.csdn.net/magictong/article/details/6306820

相关文章

  • XCTF-game

    今天在做XCTF的题目的时候遇到了game这个题目,先让它运行 之后暂停,发现停到了这里。 之后按下f8竟然和f9...

  • ASLR的关闭方法

    上次XCTF-game说了之后要学习一波aslr的关闭方法,昨天看了看逆向工程核心原理,发现上面有讲解其关闭的方法...

网友评论

      本文标题:XCTF-game

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