gpt4 book ai didi

c - 写一个 return-to-libc 攻击,但是 libc 被加载到内存中的 0x00

转载 作者:太空狗 更新时间:2023-10-29 15:27:26 25 4
gpt4 key购买 nike

我正在为我的系统安全类编写返回 libc 攻击。一、漏洞代码:

//vuln.c
#include <stdio.h>
#include <stdlib.h>

int loadconfig(void){
char buf[1024];
sprintf(buf, "%s/.config", getenv("HOME"));
return 0;
}

int main(int argc, char **argv){
loadconfig();
return 0;
}

我想使用 return to libc 攻击。编译调试程序:

$ gcc -g -fno-stack-protector -o vuln vuln.c
$ gdb vuln
(gdb) break loadconfig
(gdb) run
Reached breakpoint blah blah blah.
(gdb) p $ebp
$1 = (void *) 0xbfffefb0
(gdb) p system
$2 = {<text variable, no debug info>} 0x0016db20 <system>
(gdb) p exit
$3 = {<text variable, no debug info>} 0x001639e0 <exit>
(gdb) x/2000s $esp
...
0xbffff5af: "SHELL=/bin/bash"

为了执行攻击,我想将缓冲区溢出到 loadconfig 的返回地址(又名 $esp+4),用 的返回地址替换它code>system,然后是 exit 的返回地址(因为 system 需要一个真实的返回地址),然后是命令名(SHELL 的地址=/bin/bash 加上 6,以修剪 SHELL= 部分)。这应该可以通过制作一个包含 1024 个废话字符的 $HOME 环境变量,然后是 system 的小端地址,exit,以及/bin/bash

但是,对于我尝试过的每台计算机,system 都会加载到以 0x00 开头的地址,这将空终止 sprintf 正在读取的字符串并停止攻击死了。有什么方法可以强制 libc 加载到内存中的其他位置,还是我误解了攻击?

作为引用,我在 VirtualBox(Windows 主机)中运行 Ubuntu Server 11.10 虚拟机,gcc 版本 4.6.1 和 gdb 版本 7.3-2011.08。编辑:ASLR 被禁用,我用 -fno-stack-protector 编译以删除金丝雀。因为我没有从堆栈中执行任何东西,所以我不需要 execstack 它。

最佳答案

将重要的 libc 函数映射到包含 NULL 字节的地址的行为称为 ASCII 装甲。此保护是 RedHat Exec-shield 的一部分目前在最近的 ubuntu 发行版上启用 link要禁用它,您必须以 root 身份运行:

sysctl -w kernel.exec-shield=0

解释为 here

顺便说一句,您可以找到有关如何绕过 ASCII 装甲的有趣 Material here on exploit-db

关于c - 写一个 return-to-libc 攻击,但是 libc 被加载到内存中的 0x00,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7779534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com