缓冲区溢出后的函数调用

时间:2015-04-28 14:00:17

标签: c buffer-overflow

我看过一段视频:https://www.youtube.com/watch?v=AXQefYKWjz4

我不明白两件事:

  • 我看不到函数调用,但它发生了。
  • 他如何获得一个特定的号码,并将其写入档案。

他正在尝试编写特定值(可能是函数的地址到堆栈中的某个位置)。为什么有可能?我怎么能重复这个?

2 个答案:

答案 0 :(得分:1)

首先,这里发生的是他将函数foo()的硬编码地址存储在'文件中。他读入变量' x'。他把它存储为' 134513853 '当转换为十六进制时变为: 0x80484bd ,它必须是函数foo()地址。 所以,按执行顺序, 程序从文件中读取foo()地址,并将其复制到 x 。然后用这个地址覆盖缓冲区,这样在溢出缓冲区之后,它会覆盖返回地址

例如:

如果这是函数堆栈的样子,

  

缓冲器----------------->

     

EBP ----------------->

     

寄回地址-------->一些0x值< --- EIP

发布溢出后,它将如下所示:

  

缓冲器-----------------> 0x80484bd

     

EBP --------------------> 0x80484bd

     

返回地址 ---------> 0x80484bd< ---- EIP

暂时不要打扰小端。因此,当函数main()结束时,执行将从存储在'返回地址'的地址恢复。从而将执行转移到函数foo()并打印字符串,"欢迎来到我的..."。

关于你的第二个问题,我认为制作视频的人已经禁用了ASLR和Stack Cookies。

ASLR或地址空间布局随机化随机化可执行文件的关键部分,以便在每个新实例的不同地址存在函数。

堆栈Cookie / Canary 是一个随机运行时生成值,它放在局部变量和返回地址之间,这样任何溢出都必须首先覆盖cookie值。在函数结束之前检查此cookie值,如果存在不匹配,则函数退出,从而不会将执行流转移到攻击者控制的返回地址。

为了重复此操作,你必须在你的系统上禁用ASLR,在Ubuntu上这可以通过在终端中键入以下内容来实现,例如Bash:

回音0 | sudo tee / proc / sys / kernel / randomize_va_space

然后,您必须以下列方式编译没有堆栈cookie的程序:

gcc -fno-stack-protector -z execstack -o test test.c

了解更多信息: ASLR:http://en.wikipedia.org/wiki/Address_space_layout_randomization http://en.wikipedia.org/wiki/Buffer_overflow_protection#Canaries

希望这有帮助。

答案 1 :(得分:0)

缓冲区溢出是一种“问题”。这让程序可能会在自己的内存堆栈上写入。

这有两件事:

  • 用重要的值覆盖IP(指令指针)的返回地址
  • (over)在堆栈中写入数据,用作函数参数。

当前函数退出时,指令指针变为堆栈中的地址。如果该地址是恶意代码,则代码将像程序一样被执行。

如果在使用此类权限的程序内完成,则可以允许用户执行代码,例如 root 特权。