strcpy构造二进制字符串小问题

原创 2006年05月28日 22:21:00

在缓冲区溢出攻击程序设计中,用Strcpy()构造攻击字符串是很常见的,这两天在做一个小例子的调试过程中,没想到还出了点问题。
以前调试溢出程序时,拿的都是网上的攻击代码,很多时候只要将跳转地址处理好就行,一直没注意这样的小问题,现在认真看了下后,把它给弄明白了。

例子:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

// jmp esp address
#define jmpesp "/x12/x45/xfa/x7f"  

//jmp to shellcode
#define jmpcode "/xEB/xEE"

char shellcode[] ="/x90/x90/x90/x90/x90/x90/x90/x90";

void overflow()

 char name[8];
 char Buff[20];
 memset(Buff, 0x90, sizeof(Buff)-1);

 strcpy(Buff, shellcode);
     strcpy(Buff+12, jmpesp);   
 strcpy(Buff+16,jmpcode);
 strcpy(name,Buff);
 return;
}

void main()
{
 printf("begin overflow!!");
 overflow();
 printf("ok,end!!");
 return;
}

关于上面这个溢出小例子的原意是这样的:
在overflow()中首先为name分配了八字节的空间,先将Buff空间全设置为0x90,然后用来保存超常字符串,当执行strcpy(name,Buff)时导致溢出发生,用jmp esp地址覆盖返回地址,然后执行jmpcode指令,再次跳转至shellcode处执行相应代码。从设计思路以及具体实现上来看,这个程序完全可以达到预期效果,但实际调试中,程序并没有按照预期设想执行,竟能够打印出“ok,end!!”字符串,这是怎么回事?

在跟踪调试的过程中,发现返回地址没有被覆盖,于是查看执行完strcpy(name,Buff)后name所指地址空间的内容,竟然是
"/x90/x90/x90/x90/x90/x90/x90/x90/x00",
竟然有个结束符,把字符串给截断了,只导致EBP被改写,而返回地址并没有改变,使得流程按正常情况执行。

跟踪strcpy执行流程发现,它以四字节在源串与目标串之间拷贝数据,之后对末尾部分处理,本例执行
strcpy(Buff, shellcode)时,
当拷贝完八字节后,比较源串数据后执行如下语句
mov byte ptr [edi],dl
此时edi指向Buff+8,dl值为/x00,因此在strcpy(name,Buff)时就将八字节的/x90和一字节的/x00写入Buff地址,只改写了EBP的一个字节,没有改写到返回地址。

如果如此定义:
char shellcode[] ="/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90";
那么拷贝时产生的末尾/x00字节,将被strcpy(Buff+12, jmpesp)语句拷贝的内容覆盖,成为一个完整的字符串,程序正常溢出,跳转。
ok!

字符串复制strcpy()实现及常见问题

原型:char* strcpy(char* des , const char* src),des 和 src 所指内存区域不可以重叠且 des 必须有足够的空间来容纳 src 的字符串。 实现: ch...
  • Mary19920410
  • Mary19920410
  • 2017年03月06日 17:22
  • 697

字符串拷贝函数strcpy()

#include #includechar * my_strcpy( char *des,const char src); char * my_strcpy( char *des,const char...
  • qq_32744005
  • qq_32744005
  • 2016年07月27日 17:19
  • 505

字符串---不使用库函数,编写函数strcpy

一、问题描述已知strcpy函数的原型是 char *strcpy(char *strDest, const char *strSrc); 其中strDest是目的字符串,strSrc是源字符串。...
  • will130
  • will130
  • 2015年11月04日 20:39
  • 1263

关于字符串的赋值和strcpy 的区别

http://hi.baidu.com/todaygoodhujun/blog/item/170a80940eee1a1ed21b7006.html 使用常量字符串初始化char指针,或者使用strc...
  • zyxlinux888
  • zyxlinux888
  • 2011年05月01日 15:35
  • 2781

【C语言】字符串复制。(不能使用strcpy函数)

//字符串复制。(不能使用strcpy函数) /*#include char * my_strcpy( char * dst,char const * src) { while(*src!='\0...
  • doudouwa1234
  • doudouwa1234
  • 2015年03月27日 16:25
  • 1826

指针定义两个字符串,用strcpy交换问题?

char *pmsg = "hello,world!"; char *pnsg = "hi,there."; strcpy(pmsg,pnsg); 这样无法编译, 如果都换成是数组的话就可以编译...
  • good_jianhong
  • good_jianhong
  • 2011年10月27日 16:45
  • 1137

【c语言】模拟实现库函数strcpy函数

// 模拟实现库函数strcpy函数 #include #include char* my_strcpy(char const *p, char *q) { char *ret = q; ...
  • zhaoyaqian552
  • zhaoyaqian552
  • 2015年07月02日 10:09
  • 1011

strcpy函数详解

strcpy(s1,s2);strcpy函数的意思是:把字符串s2中的内容copy到s1中,连字符串结束标志也一起copy. 这样s1在内存中的存放为:ch\0; 在cout 如果说s1的长...
  • u014744118
  • u014744118
  • 2015年10月09日 10:37
  • 1854

使用strcpy和strcat实现字符串的连接

最为简单的代码方式一 首先是实现字符串的连接然后实现字符串的拷贝 #include #include int main(void) { char s[10]="abc"; char t...
  • u011046042
  • u011046042
  • 2014年12月05日 20:07
  • 3583

C语言:重写strcpy函数,拷贝字符串的内容

strcpy函数是用来拷贝字符串的函数,str1[]中的字符拷贝到str2[]中。 重写strcpy就是再不调用头文件#include的strcpy函数,...
  • TwinkleCapricorns
  • TwinkleCapricorns
  • 2016年10月30日 20:14
  • 784
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:strcpy构造二进制字符串小问题
举报原因:
原因补充:

(最多只允许输入30个字)