gdb修改寄存器
这篇文章做个gdb修改寄存器的教程。gdb需要安装插件,详细可看https://loonli.github.io/GateofBabylon/ctf/2017/03/20/overflow.html
题目可以在这里下载http://pan.baidu.com/s/1qYxyATY。
0x00 使用ida pro分析代码
main()
的逻辑很简单,我们直接分析check()
函数。
首先在for循环处,判断输入是否与flag
这个全局变量相同。(双击flag
可以看到flag的值)如果相同会让你输入,然后经过culc()
这个函数判断你的输入是否能通过if,如果能就输出经过enc()
加密的flag。 。但是点进关键的culc()
函数的话会发现一个很尴尬的情况:
什么?返回0?这不是永远通不过判断了么?所以我们需要用gdb来修改内存或或寄存器。
0x01 gdb修改内存
关于gdb基础的文件导入和下断点在开头提到的文章有提到,这里讲的不详细的话可以去看看。
首先我们导入文件然后查看check()
函数,并找到if判断的位置。
然后我们注意到这里调用了函数culc()
那么接下来那个je
就是我们要找的跳转。关于test eax,eax
,test的原理可以自己查查,总之这里让eax不为0,那么就能不跳转。那么我们在这一行下断点:
然后使用r命令让程序跑起来,输入flag对应的值&&jj66
后,会让你输入,但随便输就行,输完之后就会停在断点。我们来查看eax的值。
是0,那么我们把它改成1就行。使用set
命令。然后再使用c
命令让程序继续运行。
成功得到了flag。
0x02 总结
这题最难的地方应该不是修改寄存器,而是找到需要修改的位置。需要对汇编语言有一定的理解相对应的练习。