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

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

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

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

ida进行基址重定位

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

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

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

再搜索flag发现找到了:

查找交叉引用,找到引用位置。
找到了引用位置之后发现,在od重新加载设断点没有用啊,说是没有那个内存地址,看来这个程序内存基址是变的,应该是开了aslr保护了,emmmm,看来刚刚设置基址是白设置了。
电脑应该是有办法关闭aslr保护的,我先静态分析一波吧

这个显示的是应该是程序类似于printf或者scanf之类的函数吧,但是不知道ida为什么没有识别出来。
刚刚蠢了,那个done!!!的位置直接反编译就差不多得到答案了

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

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

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

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


看来是直接给程序打补丁就出来了。
如果真的阅读代码得到顺序,或者编写解密脚本可能就会费些劲了。还有一种我认为比较巧妙的办法是改eip,尝试改eip直接让程序输出done!!后面的内容,但是我操作的时候程序死掉了,不知道是不是开保护的问题。
那其实从这个题里面还能学到什么呢,应该再看看怎么给电脑关闭aslr保护,这样就算程序设置了aslr都无法地址随机化。至于具体的方法,之后再更新文章的时候再说。然后改eip程序为什么会死掉呢,应该再查查,暂时认为的可能有两种:
1.开了保护
2.没有维护好堆栈平衡
刚刚又看了看程序,发现有一个函数调用 j___RTC_CheckEsp,网上说:
调试的时候编译机自己加入的,发布版本会过滤掉此函数功能就是检查堆栈平衡
也就是说因为堆栈不平衡才出现这种问题的吗。
这次调试的时候有些奇怪,感觉和调试平常的程序有些区别,比如调试的时候不能断在我想断的地方,然后调用函数好多都是call一个函数,然后call之后的那个位置jmp到了函数体里才执行的。。。
我猜这个程序有可能涉及到了一些反调试的知识,或者这个程序不是用我所熟悉的语言写的,先给一个地址在搜索资料的时候看到的,还没仔细看,在这里mark下
https://bbs.pediy.com/thread-79205.htm
之后我用peid查了下

看来这个还真的是debug版本,而且是vc++8.0编写的。
刚才又看见了一个介绍保护的选项的文章,再mark下
https://blog.csdn.net/magictong/article/details/6306820
网友评论