关于缓冲区溢出的分析和实现(高手进)

minghui2005 2005-03-29 03:31:15
1、写一个有缓冲区溢出bug的程序
2、调试程序(反汇编),得到程序在溢出时CPU寄存器中下一条指令所指向的地址。
3、写出shellcode,实现telnet功能。也即让程序跳到telnet.exe。

我想了好多天,基本原理已经清楚,但是做成的shellcode不能实现预期的目的。希望高手给出一个完善的源代码研究研究。
...全文
370 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongpy 2005-03-30
  • 打赏
  • 举报
回复
此时cpu寄存器中下一条指令指向的内存空间肯定越界,可以修改将要填充的字符,“正好”让下一条指令指向的内存地址为我想要执行的代码
=====================================================================
这个只能通过修改函数返回地址来实现了吧!

#include <iostream.h>
#include <stdlib.h>
void fun()
{
cout<<"OK!"<<endl;
exit(0);
}

int main()
{
int buf[1];
buf[2] = (int)fun;
return 0;
}
运行结果:
OK!

测试环境: VC6
//这样可以吗?
minghui2005 2005-03-30
  • 打赏
  • 举报
回复
据我了解,程序再内存中存储的时候,还会有填充区。你的程序是利用数组的入口地址进行跳转的,并没有引发溢出,只是让数组的起始指向test()。

我的意思是,向buf中填充字符,知道全部堆满buf后引起溢出,此时cpu寄存器中下一条指令指向的内存空间肯定越界,可以修改将要填充的字符,“正好”让下一条指令指向的内存地址为我想要执行的代码,比如说cmd.exe了。
mahongxi 2005-03-30
  • 打赏
  • 举报
回复
最新的gcc4已经在这方面安全性加强了
Chillbon 2005-03-29
  • 打赏
  • 举报
回复
mark
dongpy 2005-03-29
  • 打赏
  • 举报
回复
一个缓冲区溢出例子:

#include<iostream.h>
#include<string.h>

class ClassEx
{
public:
int buff[1];
virtual void test(void){ cout << "ClassEx::test()" << endl;};
};
void entry(void)
{
cout << "OK!" << endl;
};

int main(void)
{
ClassEx obj2,obj1,* pobj;
pobj=&obj2;
obj2.test();

int vtab[1] = { (int) entry };//构造vtab,
//entry的入口地址
obj1.buff[1] = (int)vtab; //obj1.buff[1]就是 obj2的pvftable域
//这里修改了函数指针列表的地址到vtab
pobj->test();
return 0;
}
运行结果:
ClassEx::test()
OK!

测试环境: VC6

kevin_gp_webex 2005-03-29
  • 打赏
  • 举报
回复
你们 真很! 我很佩服!
大哥大姐们
你们能教教小弟么?
EnochShen 2005-03-29
  • 打赏
  • 举报
回复
typedef struct tagBufferStruct
//这里我为了使szBuffer1,szBuffer2,szBuffer3内存地址相连,使用了结构
{
char szBuffer1[15];
char szBuffer2[15];
char szBuffer3[15];
}BUFFERSTRUCT;

void CMainFrame::OnTest7()
{
BUFFERSTRUCT BufferStruct;
BufferStruct.szBuffer1[0] = '\0';
BufferStruct.szBuffer2[0] = '\0';
BufferStruct.szBuffer3[0] = '\0';

strcpy(BufferStruct.szBuffer1,"Hello Word!This is a test for Buffer Overflow!");

strOutput.Format("使用strcpy拷贝字符串\"Hello Word!This is a test for Buffer Overflow!\"的结果:\r\n\r\nszBuffer1 = \"%s\" \r\n\r\nszBuffer2 = \"%s\" \r\n\r\nszBuffer3 = \"%s\"",
BufferStruct.szBuffer1,BufferStruct.szBuffer2,BufferStruct.szBuffer3);

AfxMessageBox(strOutput);

BufferStruct.szBuffer1[0] = '\0';
BufferStruct.szBuffer2[0] = '\0';
BufferStruct.szBuffer3[0] = '\0';

memcpy(BufferStruct.szBuffer1,"Hello Word!This is a test for Buffer Overflow!",sizeof(BufferStruct.szBuffer1));

strOutput.Format("使用memcpy拷贝字符串\"Hello Word!This is a test for Buffer Overflow!\"的结果:\r\n\r\nszBuffer1 = \"%s\" \r\n\r\nszBuffer2 = \"%s\" \r\n\r\nszBuffer3 = \"%s\"",
BufferStruct.szBuffer1,BufferStruct.szBuffer2,BufferStruct.szBuffer3);

AfxMessageBox(strOutput);
}
ONCE 2005-03-29
  • 打赏
  • 举报
回复
/* 缓冲区溢出演示
* TC下编译后在命令行执行
* 执行时输入任意6个字符,然后依次输入屏幕上提示的四个数字所对应的ASCII字符
* 输入方法:按住alt不放,从小键盘输入一个ascii码,松开alt键。该字符即输入
* 此时会看到,尽管bar没在程序中被调用,但是它却被调用了
*/

#include<stdio.h>

void bar(void)
{
printf("Buffer Overflow Success!");
}

void foo(void)
{
unsigned char input[6];

printf("%u %u %u %u\n",
input[6],
input[7],
(unsigned int)bar & 0xFF,
(unsigned int)bar >> 8);
gets(input);
}

int main(void)
{
foo();
printf("Exit ok.\n");
return 0;
}
zengwujun 2005-03-29
  • 打赏
  • 举报
回复
mark
melonliu 2005-03-29
  • 打赏
  • 举报
回复
04年的程序员下册87页,慢慢看吧
zhousqy 2005-03-29
  • 打赏
  • 举报
回复
mark
dongpy 2005-03-29
  • 打赏
  • 举报
回复
void fun()
{
cout<<"OK!"<<endl;
exit(0);
}

int main()
{
int arr[6];
void (*pf)();
pf = &fun;
arr[7] = (int)pf;
return 0;
}
minghui2005 2005-03-29
  • 打赏
  • 举报
回复
比如说:server.exe具有漏洞,client.exe给server.exe发shellcode让其跳转到别的什么程序(比如说是cmd.exe),就是到最后找本机的一些相关程序时,碰到麻烦了,要让其跳转,就必须先载入动态链接库LoadLibrary("msvcrt.dll")装载vc运行时库(Runtime Library)再用GetProcAddress("system")获得system函数起址,system函数有什么作用不用我说了吧!如果不明白请参阅msdn.再用system("cmd.exe")开启cmd.exe命令控制台。
原理我懂,就是具体实施,欠缺,请高手帮忙。
kobefly 2005-03-29
  • 打赏
  • 举报
回复
程序员上也讲过

但是现在的函数返回区似乎都有保护措施了
cookie不是那么好修改的了

arrowcy 2005-03-29
  • 打赏
  • 举报
回复
这个东西在黑客技术网站上去讨论最好了,我记得有一起黑客防线还是什么杂志送了一个小册子,里面就专门讲怎么实现缓冲区溢出攻击,不过我已经忘了是怎么做的了
寻开心 2005-03-29
  • 打赏
  • 举报
回复
http://www.kehui.net/html/article/30/29998.html
寻开心 2005-03-29
  • 打赏
  • 举报
回复
http://bbs.s8s8.net/forums/lofiversion/index.php/t13213.html

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧