我看过一段视频:https://www.youtube.com/watch?v=AXQefYKWjz4
我不明白两件事:
他正在尝试编写特定值(可能是函数的地址到堆栈中的某个位置)。为什么有可能?我怎么能重复这个?
答案 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)
缓冲区溢出是一种“问题”。这让程序可能会在自己的内存堆栈上写入。
这有两件事:
当前函数退出时,指令指针变为堆栈中的地址。如果该地址是恶意代码,则代码将像程序一样被执行。
如果在使用此类权限的程序内完成,则可以允许用户执行代码,例如 root 特权。