【发布时间】:2018-09-23 02:11:46
【问题描述】:
阅读本文时article 这是关于绕过一些保护
如果你开始阅读那篇文章,你会发现作者做了一个我不明白的非常奇怪的计算:
好的,我们开始吧:
RET2RET
演示代码(包含易受攻击的函数strcpy)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char **argv) {
char buf[256];
strcpy(buf, argv[1]);
return 1;
}
用 GDB 反汇编上面的代码后,你会得到这样的东西(反汇编 main 函数):
(gdb) disassemble main
Dump of assembler code for function main:
0x08048384 <main+0>: push %ebp
0x08048385 <main+1>: mov %esp,%ebp
0x08048387 <main+3>: sub $0x108,%esp
0x0804838d <main+9>: and $0xfffffff0,%esp
0x08048390 <main+12>: mov $0x0,%eax
0x08048395 <main+17>: sub %eax,%esp
0x08048397 <main+19>: sub $0x8,%esp
0x0804839a <main+22>: mov 0xc(%ebp),%eax
0x0804839d <main+25>: add $0x4,%eax
0x080483a0 <main+28>: pushl (%eax)
0x080483a2 <main+30>: lea 0xfffffef8(%ebp),%eax
0x080483a8 <main+36>: push %eax
0x080483a9 <main+37>: call 0x80482b0 <_init+56>
0x080483ae <main+42>: add $0x10,%esp
0x080483b1 <main+45>: mov $0x1,%eax
0x080483b6 <main+50>: leave
0x080483b7 <main+51>: ret
End of assembler dump.
(gdb)
之后我们在 strcpy 上设置一个断点,因为它是一个易受攻击的函数:
(gdb) break *main+37
Breakpoint 1 at 0x80483a9
现在我们运行我们的程序并给它一大块A char 来溢出缓冲区
(gdb) run `perl -e 'print "A"x272'`
Starting program: /tmp/vuln `perl -e 'print "A"x272'`
之后我们打印eax寄存器的内容(我认为eax持有buf地址,如果我错了,请纠正我)
(gdb) print (void *) $eax
$1 = (void *) 0xbffff5d0
好吧,文章的作者在下面说这个声明
简单的计算给出'buf'变量范围[
0xbffff6d8-0xbffff5d0] / (264 bytes;0x108h)
我不知道这是什么意思,也不知道他在哪里想出了0xbffff6d8 地址
【问题讨论】:
-
作者是否说明了
main将从何处加载其返回地址?就像上面ebp指向的地方一样,因为这个函数使用了旧的堆栈帧?估计计算的重点是找出攻击者应该在哪里放置一个新的返回地址。 -
我不知道@PeterCordes
-
@PeterCordes 如果你有时间可以查看我放了链接的那篇文章
-
嗨@PeterCordes你能帮我理解这个请“计算是为了弄清楚攻击者应该把新的返回地址放在哪里”
标签: c assembly x86 64-bit buffer-overflow