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!

相关文章推荐

(php的弱类型导致的小问题)某变量可能是数字或非数字(对象、字符串、json等)时,应该如何去判断

注意:php中变量可能是数字或非数字(对象、字符串等)时,应该注意: 由于php的弱类型,导致其变量判断很复杂,并且稍有不慎即会出错,因此php强大的字符处理函数库便成为phper的必修课。 例子...
  • Rflyee
  • Rflyee
  • 2012年11月18日 16:18
  • 894

golang 转换json字符串为json对象的小问题

前段时间修改了一个小小的管理系统,本来是挺简单的 按照用户需求显示一些数据,但是却为了一个小小的错误,竟然找了两个晚上的bug,白天上课,所以只能晚上做东西了,好了,进入正题。一般我们在js中发送一个...
  • Tangs_
  • Tangs_
  • 2015年12月19日 00:27
  • 2837

C字符串的小问题

string与char *、char[]之间的转换 提示 string可以被看成是以字符为元素的一种容器。字符构成序列(字符串)。有时候在字符序列中进行遍历,标准的string类提供了ST...

读写的文件以及拆分字符串的小问题

今天写了个Android登录界面的小程序,要求将用户名和密码在点击保存密码的CheckBox的情况下被保存在文件中。再次打开这个app的时候如果存信息的文件里面有东西就回显在对应的userName和p...

有关C++中常量字符串的一个小问题

在C++中,常量字符串存储在常量存储区,不允许被修改。 对于一个变量,要考虑到其定义、释放、存储区域、是否允许被修改。 在C++中,内存分为5个区,分别是: 1.栈,就是那些由编译器在需要的时候分配,...

小问题综合 如何实现将文件从一个文件夹复制到另一个文件夹、字符串单斜杠转为双斜杠、浏览文件对话框

1.使用CopyFile函数来实现将一个文件从一个文件夹复制到另一个文件夹中去: //以下代码是线串文件从原始路径lj复制到to_out路径中去 //复制文件夹函数BOOL CopyFile{LPC...

编程两个小问题,C语言中如何读取一行字符串的问题和VS2008中调试出错一个问题

问题一: 经常在链接是报link2001错误,其中一般是函数体没有定义错误。但是排除以上简单的外,还有一种如下无法解析系统文件中的函数定义。如下: LINK : warning LNK4098...

java--二进制字符串匹配的问题

描述 Given two strings A and B, whose alphabet consist only ‘0’ and ‘1’. Your task is only to tell ho...

数据结构及小问题程序代码实现

  • 2015年08月08日 15:20
  • 9.69MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:strcpy构造二进制字符串小问题
举报原因:
原因补充:

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