Ubuntu 9.10环境下缓存区溢出攻击实验(2)

发现第217行:sub $0x28, %esp   即为getbuf()申请了40个字节的堆栈空间,我们申请的数组是从当前基址偏移24个字节开始的,负责检查缓存区溢出的%gs:0x14是从当前基址偏移12个字节开始的。
(注:4.4.1以前的版本char数组是从当前基址偏移16个字节处开始,负责检查缓存区溢出的%gs:0x14是从当前基址偏移4个字节开始的)

查看test()函数:
08048600 <test>:
236  8048600:   55                      push   %ebp
237  8048601:   89 e5                   mov    %esp,%ebp
238  8048603:   83 ec 18                sub    $0x18,%esp
239  8048606:   c7 44 24 04 60 87 04    movl   $0x8048760,0x4(%esp)
240  804860d:   08
241  804860e:   c7 04 24 01 00 00 00    movl   $0x1,(%esp)
242  8048615:   e8 f2 fd ff ff          call   804840c <__printf_chk@plt>
243  804861a:   e8 a1 ff ff ff          call   80485c0 <getbuf>
244  804861f:   c7 44 24 04 71 87 04    movl   $0x8048771,0x4(%esp)
245  8048626:   08
246  8048627:   c7 04 24 01 00 00 00    movl   $0x1,(%esp)
247  804862e:   89 44 24 08             mov    %eax,0x8(%esp)
248  8048632:   e8 d5 fd ff ff          call   804840c <__printf_chk@plt>
249  8048637:   c9                      leave
250  8048638:   c3                      ret
251  8048639:   8d b4 26 00 00 00 00    lea    0x0(%esi,%eiz,1),%esi
从244行起是关键,246行是把指针指向位置设为1,由此猜测%esp存放的可能是printf的参数数目,247行是把eax的值压到esp+8的位置,由上面的getbuf的代码我们知道eax存放的是getbuf的返回值,所以我们只需要在调用call printf之前把0xdeadbeef压入esp+8的位置就可以实现我们的目的了。

正常时整个堆栈的情况如下所示:
——————
%eax
——————
0x8048771
——————
0x1                       <----esp
——————
返回地址(call getbuf下一条指令)
——————
%ebp
——————
8个字节
——————
%gs:0x14
——————
12个字节
——————

至此整体的思路已经有了:通过缓存区溢出修改printf的相关参数和getbuf()ret的地址,使之跳过call getbuf和call printf之间的代码,直接执行printf。即如下形式:
——————
0xdeadbeef
——————
0x8048771
——————
0x1                       <----esp
——————
返回地址(call printf的地址)
——————
%ebp
——————
8个字节
——————
%gs:0x14
——————
12个字节
——————

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwpgsx.html