系列C++问题请教高手之九:buffer overflow
|
发表于:2007-10-24 13:41:51 楼主
|
近日走火入魔,看了一下bufferoverflow,在以下代码中:在VC6中打印出来的信息是:Addressoffunction:0x0040100f,但在LINUX中打印出来的提示却是段错误,请问应该怎么改? #include"string.h" #include"stdio.h"
intcopy(char*input) { return0; }
inthacked(void) { printf("Canyouseemenow?/n"); exit(0); }
voidmain(intargc,char*argv[]) { printf("Addressoffunction:0x%08x/n",hacked); exit(1); }
2、另外一个问题是: 在VC6中反汇编,结果如下:hacked()的地址貌似是:00401080,和打印出来的信息:Addressoffunction:0x0040100f不一样!!请高手指点!
19:inthacked(void) 20:{ 00401080pushebp 00401081movebp,esp 00401083subesp,40h 00401086pushebx 00401087pushesi 00401088pushedi 00401089leaedi,[ebp-40h] 0040108Cmovecx,10h 00401091moveax,0CCCCCCCCh 00401096repstosdwordptr[edi] 21:printf("Canyouseemenow?/n"); 00401098pushoffsetstring"AAAABBBBCCCCDDDDEEEE/x80/x10@"(0042001c) 0040109Dcallprintf(00401410) 004010A2addesp,4 22:exit(0); 004010A5push0 004010A7callexit(00401280) 23:} |
|
|
问题点数:20回复次数:19 显示所有回复
显示星级回复
显示楼主回复
|
|
<iframe id="Topic_Zone" style="HEIGHT: 4px" marginwidth="0" marginheight="0" src="/u/AD/Topic_Zone.aspx" frameborder="0" width="100%" scrolling="no" height="0"></iframe>
|
发表于:2007-10-24 13:48:001楼得分:0
|
00401080pushebp 00401081movebp,esp 00401083subesp,40h 00401086pushebx
前面这一排是EIP,不是函数地址。
打开你的调试器的寄存器,看EIP的变化~
|
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 14:01:042楼得分:0
|
00401080pushebp 00401081movebp,esp 00401083subesp,40h 00401086pushebx 前面这一排是EIP,不是函数地址。 打开你的调试器的寄存器,看EIP的变化~ ============================================= 有点不明白,EIP不就是函数地址吗?? 如果不是,那么函数的入口地址跟调用它执行代码时的EIP有什么关系? 请解答,谢谢!
|
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 14:08:003楼得分:0
|
1.大约是不是gcc把你的小函数给内联了?
2.你在debug模式下用vc跟踪汇编代码, 0x0040100fjmp00401080
而且release模式下就没有这个问题。 |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 14:44:134楼得分:0
|
关于第二个问题,有位二星专家裸体跪求过,见贴: http://topic.csdn.net/u/20070716/22/72161ea9-3635-4d17-830c-4334573d5408.html |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 14:47:175楼得分:0
|
1.大约是不是gcc把你的小函数给内联了? 2.你在debug模式下用vc跟踪汇编代码, 0x0040100fjmp00401080 ================================= 厉害,看了一下,果然是: 0x0040100fjmp00401080 对于1、这一点先不管它。。。 我现在:想做的一点是覆盖EIP,照着书上讲的意思,写了如下代码, intcopy(char*input) { charvar[20]; charchtocopy[24]="AAAABBBBCCCCDDDDEEEE/x80/x10/x40"; strcpy(var,chtocopy); // var[20]= '/x80 '; // var[21]= '/x10 '; // var[22]= '/x40 '; return0; } 请问运行结果为什么不正确? |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 14:55:226楼得分:0
|
函数的地址指向的实际上是一个跳转指令 |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 14:59:527楼得分:0
|
Addressoffunction:0x0040100f是真正的函数地址。 比如说0x0040100f处的memory为e9d90a,它其实表示这样一条指令 jmp代码段首地址+0x00000ad9(也就是0x00401080) |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 15:00:448楼得分:0
|
关于第二个问题,有位二星专家裸体跪求过,见贴: http://topic.csdn.net/u/20070716/22/72161ea9-3635-4d17-830c-4334573d5408.html ===================================================== 谢谢! 第二个问题解决了,现在可以跳转到hacked()函数了。 但第一个问题gcc的问题,还不明白: 记得有个保留字可以禁止编译器优化代码--就是没用的变量也留着。。。那个关键字是什么写着?请问:) |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 15:07:219楼得分:0
|
gcc编译器用的比较少。 有时间访问一下www.devdiv.net吧 |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 15:13:4210楼得分:0
|
Addressoffunction:0x0040100f是真正的函数地址。 比如说0x0040100f处的memory为e9d90a,它其实表示这样一条指令 jmp代码段首地址+0x00000ad9(也就是0x00401080) ============================================ 明白,现在把 charchtocopy[28]="AAAABBBBCCCCDDDDEEEE/x80/x10/x40"; 改成charchtocopy[28]="AAAABBBBCCCCDDDDEEEEFFFF/x80/x10/x40";已经可以跳转了。
就是Linux下GCC的那个问题没解决,不知道为什么。。。。 |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 15:14:3711楼得分:0
|
gcc编译器用的比较少。 有时间访问一下www.devdiv.net吧 ============================== 好的,这个网站做什么的? |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 15:16:5512楼得分:0
|
在VC中,只要把debuginformationformat设置成ProgramDatabase(/Zi)就不会有这么一个jmp了。 release模式下,已经默认设置为ProgramDatabase(/Zi),所以没有jmp问题 |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 15:26:1613楼得分:0
|
gcc编译器用的比较少。 有时间访问一下www.devdiv.net吧 ======================================= 看了,你做的B
在VC中,只要把debuginformationformat设置成ProgramDatabase(/Zi)就不会有这么一个jmp了。 release模式下,已经默认设置为ProgramDatabase(/Zi),所以没有jmp问题BS? ======================================================================================== 好的,谢谢。 |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 15:26:5014楼得分:0
|
贴个GCC反汇编出来的看看。 |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 16:25:5015楼得分:0
|
贴个GCC反汇编出来的看看。 ================================== .file "Cpp1.cpp" .section .rodata .LC0: .string "AAAABBBBCCCCDDDDEEEEFFFF/200/020@" .text .align2 .globl_Z4copyPc .type _Z4copyPc,@function _Z4copyPc: .LFB2: pushl %ebp .LCFI0: movl %esp,%ebp .LCFI1: pushl %edi .LCFI2: pushl %esi .LCFI3: subl $64,%esp .LCFI4: leal -72(%ebp),%edi movl $.LC0,%esi cld movl $7,%eax movl %eax,%ecx rep movsl subl $8,%esp leal -72(%ebp),%eax pushl %eax leal -40(%ebp),%eax pushl %eax .LCFI5: call strcpy addl $16,%esp movl $0,%eax leal -8(%ebp),%esp popl %esi popl %edi leave ret .LFE2: .Lfe1: .size _Z4copyPc,.Lfe1-_Z4copyPc .section .rodata .LC1: .string "Canyouseemenow?/n" .text .align2 .globl_Z6hackedv .type _Z6hackedv,@function _Z6hackedv: .LFB4: pushl %ebp .LCFI6: movl %esp,%ebp .LCFI7: subl $8,%esp .LCFI8: subl $12,%esp pushl $.LC1 .LCFI9: call printf addl $16,%esp subl $12,%esp pushl $0 call exit .LFE4: .Lfe2: .size _Z6hackedv,.Lfe2-_Z6hackedv .section .rodata .LC2: .string "Addressoffunction:0x%08x/n" .text .align2 .globlmain .type main,@function main: .LFB6: pushl %ebp .LCFI10: movl %esp,%ebp .LCFI11: subl $8,%esp .LCFI12: andl $-16,%esp movl $0,%eax subl %eax,%esp subl $12,%esp movl 12(%ebp),%eax addl $4,%eax pushl (%eax) .LCFI13: call _Z4copyPc addl $16,%esp subl $8,%esp pushl $_Z6hackedv pushl $.LC2 call printf addl $16,%esp subl $12,%esp pushl $1 call exit .LFE6: .Lfe3: .size main,.Lfe3-main .ident "GCC:(GNU)3.2.220030222(RedHatLinux3.2.2-5)"
|
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 16:26:5216楼得分:0
|
贴个GCC反汇编出来的看看。 ================================== C源代码如下: #include"stdlib.h" #include"string.h" #include"stdio.h" intcopy(char*input) { charvar[20]; charchtocopy[28]="AAAABBBBCCCCDDDDEEEEFFFF/x80/x10/x40"; strcpy(var,chtocopy); return0; } inthacked(void) { printf("Canyouseemenow?/n"); exit(0); }
intmain(intargc,char*argv[]) { copy(argv[1]); printf("Addressoffunction:0x%08x/n",hacked); exit(1); return0; }
|
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-27 12:00:4317楼得分:0
|
请大家说说以下这段代码: inthacked(void) { printf("Canyouseemenow?/n"); exit(0); }
intmain(intargc,char*argv[]) { printf("Addressoffunction:0x%08x/n",hacked); exit(1); return0; } 在Linux下运行出现段错误的问题啊。。。谢谢! |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-27 14:02:4018楼得分:0
|
我的在linux下面一切正常啊。 |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-29 14:50:0019楼得分:0
|
我的在linux下面一切正常啊。 ====================== 其怪,今天重新编译又没有问题了。。。。 |
|
分享到:
相关推荐
通过深入理解并实践"Lab1-Buffer OverFlow"中的内容,开发者可以更好地了解和预防缓冲区溢出问题,提高软件的安全性。同时,这也是提升安全意识和技能的重要步骤,对于防止黑客攻击和保障系统安全具有重要意义。
**Buffer Overflow攻击与防御** Buffer Overflow(缓冲区溢出)是一种常见的计算机安全漏洞,它发生在程序尝试向固定大小的内存缓冲区写入超出其实际容量的数据时。这种攻击利用了编程语言(如C和C++)对内存管理的...
Buffer Overflow是一种常见的软件安全漏洞,它发生在程序试图在内存缓冲区之外写入数据时,超出其分配的空间,可能覆盖相邻的数据区域,导致程序崩溃或执行恶意代码。复旦大学的软件安全SEED labs系列实验旨在让学生...
鸡啄米:C++编程入门系列之九(函数的定义与调用) 鸡啄米:C++编程入门系列之十(函数的参数传递与内联函数) 鸡啄米:C++编程入门系列之十一(重载函数与函数模板) 第四部分:类与对象 鸡啄米:C++编程入门...
Protocol Buffer 3.0 (简称protobuf) 是该技术的第三个主要版本,提供了更强大的功能和改进的API,特别是在C++语言中的应用。 在C++中使用Protocol Buffer 3.0,首先需要理解它的基本概念和工作流程。它主要包括三...
可能的问题在于,多次申请的问题,经过测试基本可以用。 方法2: 1、使用默认缓存5M 2、默认线程使用的内存为128K,即最多默认支持40个线程 3、初始化申请一块5M内存,然后进行分割,线程使用的定义为GROUP,没...
C++ 11 ,thread ,atomic ,mutex ,condition_variable 。 程序特性: 1.每个实例支持读写双线程。 2.数据一致。 3.ringbuffer为空时,读取时候等待。直到有数据写入,再继续读取。 4.当写入数据的长度大于ring...
在C++中,Protocol Buffer提供了强大的工具`protoc`,用于将`.proto`文件转换为对应编程语言(如C++)的源代码,使得开发者能够方便地在应用程序中使用这些数据结构。 首先,我们要理解如何生成C++代码。`.proto`...
C++作为一门强大的面向对象编程语言,为实现串口通信提供了良好的支持。本篇将详细介绍"C++串口类SerialPort"的相关知识点,以及如何通过源代码进行串口通信的实现。 首先,`CSerialPort` 类是对串口通信功能进行...
- **社区论坛**:Stack Overflow、Reddit等平台上有大量的C++问题解答和讨论。 总之,作为一门历史悠久且功能强大的编程语言,C++在软件开发领域扮演着举足轻重的角色。通过深入学习标准C++的相关知识和技术,...
总的来说,C++多线程内存池和简单的BUFFER类是解决高并发、高性能问题的有效手段。通过合理的设计和实现,我们可以创建出高效、稳定、线程安全的程序。在实际应用中,这不仅可以优化内存管理,还能降低延迟,提升...
《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、noexcept规范、完美转发、智能指针make函数的优缺点;讲解std∷move,std∷forward,rvalue引用和...
Visual C++ 6.0,作为Microsoft公司推出的经典编程工具,是许多程序员的启蒙之选,尤其对于学习C/C++语言的初学者而言,其强大的开发环境和易用性使其深受喜爱。然而,随着Windows操作系统的更新迭代,尤其是Win7...
Thinking in C: Foundations for Java & C++ by Chuck Allison produced by Bruce Eckel Chapter 1: Introduction and Getting Started40 MinutesStart Lecture Chapter 2: Fundamental Data Types41 ...
通过以上分析,我们可以看出,"Storage and Buffer Manager C++实现"是一个综合性的项目,涵盖了数据库系统的核心组件和C++编程技巧。实际开发时,需要考虑性能优化、内存管理和并发控制等多个方面,以构建一个高效...
C++17 标准 ISOIEC 14882 2017 官网 https://www.iso.org/standard/68564.html ISO/IEC 14882:2017 Preview Programming languages -- C++ ISO/IEC 14882:2017 specifies requirements for implementations of the ...
### C++并发编程实践 #### 一、简介与并发编程基础 《C++并发编程实践》这本书由Anthony Williams编写,是一本深入讲解C++多线程编程技术的专业书籍。本书旨在帮助读者掌握C++中的并发编程技巧,并通过大量的示例...
size_t bytes_transferred = socket.read_some(boost::asio::buffer(file_buffer.prepare(content_length - file_buffer.size()))); file_buffer.commit(bytes_transferred); if (file_buffer.size() == content_...
本示例“多线程BUFFER例子”是通过C++实现的,展示了如何在缓冲区(BUFFER)中实现消费者与生产者的并发操作。下面将详细解释这个主题中的关键知识点。 首先,我们要理解什么是生产者-消费者问题。这是一个经典的...
在实际应用中,你可能还需要处理错误、重试机制、多线程和异步操作等问题。Eclipse Paho库提供了丰富的功能,使得C++开发人员能够轻松地集成MQTT通信到他们的物联网应用程序中。 总的来说,C++实现MQTT协议主要涉及...