经过一些研究,我没有找到任何描述方法的论文(甚至没有一个不可靠的方法).看来SSP(StackSmashing Protection)/ Propolice
这是c中的一个例子:
#include <stdio.h>
#include <string.h>
void bad() {
printf("Oh shit really bad~!\r\n");
}
void foo() {
char overme[4] = "WOW";
*(int*)(overme+8) = (int)bad;
}
int main() {
foo();
}
Run Code Online (Sandbox Code Playgroud) 我有一个关于内存分配顺序的问题.在下面的代码中,我在循环中分配4个字符串.但是当我打印地址时,它们似乎并没有一个接一个地分配......我做错了什么,或者是OS实施的某种防御机制,以防止可能的缓冲区溢出?(我使用Windows Vista).
谢谢.
char **stringArr;
int size=4, i;
stringArr=(char**)malloc(size*sizeof(char*));
for (i=0; i<size; i++)
stringArr[i]=(char*)malloc(10*sizeof(char));
strcpy(stringArr[0], "abcdefgh");
strcpy(stringArr[1], "good-luck");
strcpy(stringArr[2], "mully");
strcpy(stringArr[3], "stam");
for (i=0; i<size; i++) {
printf("%s\n", stringArr[i]);
printf("%d %u\n\n", &(stringArr[i]), stringArr[i]);
}
Run Code Online (Sandbox Code Playgroud)
输出:
abcdefgh 9650064 9650128
祝你好运9650068 9638624
mully 9650072 9638680
stam 9650076 9638736
valgrind找不到任何有用的东西.我糊涂了.
Symptomes:
PS:代码不会出现段错误
目前我通过mmap()+ 替换所有malloc()取得了一些进展mprotect()
我一直在试验FreeBSD系统上的缓冲区溢出.作为第一个实验,我试图让被利用的程序启动另一个进程(在这种情况下为/ bin/hostname).一切正常,程序打印主机名然后终止.之后我尝试让程序产生一个shell(即执行/ bin/sh).我假设这可以通过简单地交换表示要调用的程序的字符串来完成.当我尝试这个时,被利用的程序就会退出,根据gdb它确实成功生成了一个新进程(/ bin/sh).但是,没有生成shell.然后我尝试了我的第一个漏洞并将/ bin/sh文件移动到/ bin/hostname,仍然没有改变任何东西.我现在的问题是,从任何其他命令执行/ bin/sh似乎有什么不同?
作为参考,对于shell生成尝试,我使用了以下shellcode:
char code[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68"
"\x68\x2f\x62\x69\x6e\x89\xe3\x50"
"\x54\x53\xb0\x3b\x50\xcd\x80";
Run Code Online (Sandbox Code Playgroud) 我知道像c#这样的语言不容易受到缓冲区溢出的影响,除非你编组或使用不安全的代码.但是容易受到缓冲区溢出的影响吗?
作为课程作业的一部分,我需要编写一个漏洞利用代码来导致缓冲区溢出并执行堆栈中存在的代码.
我已通过以下命令关闭堆栈随机化:sysctl -w kernel.randomize_va_space = 0但是,我无法找到关闭堆栈执行保护的方法.我不确定在ubuntu中是否有一些堆栈exec保护...所以我的第一个问题是在ubuntu 8.10中是否有像red hat的exec-shield这样的东西,如果有,我们怎么能把它关掉.
我一直试图导致缓冲区溢出并从堆栈执行指令,但每当我尝试这样做时,它会给我一个seg错误.
我有ubuntu 8.10 64位,但是程序即时调试是在关闭堆栈保护的i386机器上编译的.
我从一本书中读到,缓冲区溢出可能用作注入将攻击系统的漏洞利用代码的方式。和堆栈随机化是防范此类攻击的有效途径之一。
我不明白什么是堆栈随机化及其如何防止这些攻击?
我将自己介绍给C/C++中的套接字编程,并使用send()和recv()通过TCP套接字在客户端和服务器程序之间交换数据.
以下是我的代码中的一些相关摘录:
server.c:
char recv_data[1024];
// Socket setup and so on ommited...
bytes_recieved = recv(connected, recv_data, 1024, 0);
recv_data[bytes_recieved] = '\0';
Run Code Online (Sandbox Code Playgroud)
client.c:
char send_data[1024];
// Setup ommited...
send(connected, send_data, strlen(send_data), 0);
Run Code Online (Sandbox Code Playgroud)
它recv()本身是否提供任何防止缓冲区溢出的保护?例如,如果我将第3个参数更改recv()为高于recv_data(例如4000)指向的缓冲区的某个值- 这是否会导致缓冲区溢出?(我实际上尝试过这样做,但似乎无法触发段错误).
我实际上是在尝试创建一个故意易受攻击的服务器程序来更好地理解这些问题,这就是我试图溢出的原因recv().
修正案:
不无关系,将会发现为什么client.c上面会发送超过1024指定的字节数strlen(send_data).我正在使用gets(send_data)从标准输入填充该缓冲区,但如果我通过标准输入输入超过1024个字节,server.c程序显示它接收所有的字节!:).是否strlen(send_data)为send()不限制发送的字节数量?
我一直在关注一些有关缓冲区溢出利用的教程。但是我的问题是,我无法打开根外壳程序,而是总会得到一个普通的用户外壳程序。我检查了以下几点
我重新验证了以下各项,但仍然无法实现实际的root shell:
有人知道可能是什么问题吗?为什么我仍然无法获得root shell?
在此先感谢您的任何建议和提示。最好的Zaphoxx
易受攻击的C代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void shell(){
system("/bin/sh");
exit(0);
}
int vuln(){
char buf[4];
ssize_t l=0;
printf("[+] input: ");
l=read(0,buf,128);
printf("[+] recv: ");
write(1,buf,l);
return 0;
}
int main(){
//setbuf(stdout,0);
setuid(0);
seteuid(0);
vuln();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
python利用脚本创建有效负载: …