b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

缓冲区溢出攻击定义_缓冲区溢出攻击_缓冲区溢出攻击 原因(2)

电脑杂谈  发布时间:2017-02-06 07:00:39  来源:网络整理

查看cookie中的值为0x603cc5ae,而global_value在内存0x804a1处。由于最后要跳转到bang,所以要在代码返回时给%esp一个返回bang的返回地址。代码如下:

画出栈图如下:

最后输入的字符如下:

其实,这关所花的功夫远不止这些。代码是很早就想出来了,但一个诡异的问题是在gdb中运行正确,在shell中运行却始终报段错误。这个问题又没办法在gdb中还原,搞得快抓狂了,穷尽了各种方法,最后通过了一个机缘巧合地发现,原来栈在程序运行时的内存地址是不固定的,所以movl $0xbfffb6a0, %esp这句是十分依赖栈运行的情况的,由于rtn addr里填入的也是栈的指令区地址,所以根本没办法得出一个通用的指令。这次debug的过程异常的枯燥,几乎用了一个晚上一个下午。结论就是:缓冲区的攻击有时是十分依赖特定的机器、特定的运行情况、特定的编译器。总之,攻击的代码不是放诸四海皆准的。(P.S.在这之后看了level4中的一句话:Stack positions also differ when running a program under GDB, since GDB uses stack space for some of its own state. 晕厥了)

===============level 3=============

这关需要运行if (val == cookie)分支,而运行此分支需要getbuf()返回值为cookie。经过了level3可以知道并不难,只要在栈中插入指令movl cookie, %eax,另外需要注意的是对于%ebp的还原问题,由于返回到test()函数时,程序会用到相对于%ebp的物理内存地址,所以在写字符串时应考虑到%ebp的原值不应覆盖。

最后的代码如下:

缓冲区溢出攻击 原因_缓冲区溢出攻击定义_缓冲区溢出攻击

===============level 4=============

题目和level3要完成的大致相同,而这题的栈是会浮动的,共需执行5次。

这题最关键的一点是栈是变动的,而返回地址是一个绝对的物理地址,而我要执行攻击代码就必须知道确切的物理地址。但苦于栈地址的变动,根本无法确定出返回地址。想了各种方法:相对地址,跳转到%esp处等等。但最根本的原因是返回地址是一个绝对地址跳转,所以没有解决方案。最后,参考了 终于释怀了。

题设中有一句是我一直忽略的:The code that calls getbufn first allocates a random amount of storage on the stack (using library function alloca) that ranges between 0 and 127 bytes.

而查看getbufn()函数:

可得知buf的缓冲区为512字节,127 * 2= 514,隐约可以感觉出这其中的微妙性。

不妨先做个实验,由于相同的攻击代码要执行5次,栈的地址也可能变换5次,所以对关键的%ebp寄存器进行采样,得出了三个不同的%ebp值:

根据三个%ebp的采样和“ranges between 0 and 127 bytes”这句话,可以得出高地址的%ebp极限情况(highest %ebp)和低地址%ebp的极限情况(lowest %ebp)。

再来想一想攻击代码该怎么写,其实和level3也差不多,不同的是由于每次%ebp的值可能是不同的,所以还原%ebp得想一个比较tricky的方法。这时可能会想到相对地址,于是又想到其实每次old %ebp – new %ebp = 常数。而这个常数是多少呢,gdb一下,得出0x20。缓冲区溢出攻击但由于当我们的攻击代码运行时new %ebp的值已被覆盖,所以要另想一个办法间接地得出new %ebp。于是,想到当函数返回时,%esp = new %ebp + 8,得到:

old %ebp – (%esp – 8)= 0x20

old %ebp = %esp + 0x18

接下来的就比较好办了:

最后的问题就剩下如何设置rtn addr。由于buf有512字节,必定有许多空余字节,所以根据题干的提示,在之前插入nop是个好办法。根据getbufn()中:

得出buf起始处距离%ebp寄存器520字节。

所以highest %ebp的buf段[0xbfffb4ef, 0xbffb6f7),

lowest %ebp的buf段[0xbfffb421, 0xbfffb629)。

取交集[0xbfffb4ef, 0xbfffb629),由于%ebp前攻击代码的字节数15字节。所以进一步缩小区间[0xbfffb4ef, 0xbfffb61a)。缓冲区溢出攻击于是选0xbfffb529吧。

最后的代码如下:

撒花啦!总算是完结篇了


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-30833-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 司马德宗
      司马德宗

    • 后主萧琮
      后主萧琮

      教授大人我想找几个穷人合伙娶你家女儿

    热点图片
    拼命载入中...