这看上去是一个2013年的CTF题,就一点点加油吧!
题目链接:http://ctf5.shiyanbar.com/re/Dice.exe
1、是个exe文件,常规操作,Exeinfo PE查看一下。
2、建议Ida,那就Ida打开吧。
3、逻辑还是有点多的,忽然想起了看提示:Beat our dice game and get the flag。看上去是个骰子游戏啊,试一下吧。
4、扔对了就继续,扔错了就退出,就是一个随机扔啊。
回到Ida,找String(View->open subviews->Strings),发现蹊跷:
5、双击进入:
6、双击DATA后面的WinMain进入调用,然后F5反编译:
7、可以看到结果就在v84中。然后再看逻辑,每次扔数值都是v82随机:
8、看完逻辑发现扔的顺序需要是3-1-3-3-7,而7是不会扔出来的(我第一次运行的时候前四个都rand对了。。。太神奇了),因为最后一次根本没有扔,看源码
并没有对v82进行rand
9、接下来使用od吧!
使用F2在此处设置断点(因为下一行有注释),F9运行:
在运行到此处时暂停:
虽然投出了1,但是可以更改z指示位使其不跳转,这里看跳转条件为jnz,即不为0跳转,z为1时表示为0,因此z改为1(或者直接把这一句改为nop)。
然后回车发现到了下一个扔骰子处,依旧下断点改z执行。
10、最后一步发现出问题了,如果一直不跳转,会最后跳出来说遇到了莫名的错误,因此我每次扔骰子后更改比较语句,我扔几就是给我比较几,每次都会过跳转(或者改jnz为jz也行反正就是要执行跳转)
11、但是还是不行:
12、回到Ida看逻辑,有一个和ebCTF的比较:
13、回到od,原来是这个地方在作祟,设个断点。
je为z=1时跳转,真的狡猾,现在要把z再设成0(或者直接je换nop)。
14、恶心的题目,看这里:
15、原因是有个时间判断函数,会测试你投骰子的时间,特别恶心。
16、解决方法,在9-13步,把之前的jnz的和最后一个je都改为nop,然后直接右键复制到新的可执行文件,然后疯狂回车,就出结果了。。。
(tips:使用cmd打开exe最后不会闪退)
小结:网上的解决办法都是假的,还是我的OD有毒,反正就是跑出来乱码。。心情糟糕,最后终于解决。
网友评论