缓冲区溢出(1)
来源:互联网 发布:行知职高图片 编辑:程序博客网 时间:2024/05/20 05:10
缓冲区溢出(1)
最最简单的第一次实验....
环境:VC 6.0
程序:
#include<stdio.h>#include<stdlib.h>void jmp(){printf("success!\n");_exit(0);}int main(){int buffer[1];buffer[2] = 0x00401020;//0x401020//buffer[2] = (int)jmp; //0x401005//printf("%x\n",buffer[2]);return 0;}
运行结果:
main 函数的反汇编结果:
10: int main()11: {0040D730 push ebp0040D731 mov ebp,esp0040D733 sub esp,44h0040D736 push ebx0040D737 push esi0040D738 push edi0040D739 lea edi,[ebp-44h]0040D73C mov ecx,11h0040D741 mov eax,0CCCCCCCCh0040D746 rep stos dword ptr [edi]12: int buffer[1];13: buffer[2] = 0x00401020; //0x4010200040D748 mov dword ptr [ebp+4],offset jmp (00401020)14: //buffer[2] = (int)jmp; //0x40100515: //printf("%x\n",buffer[2]);16: return 0;0040D74F xor eax,eax17: }
根据11 ~ 12行之间的指令可以推断出当前的栈是这样的:
其中一条指令
rep stos dword ptr [edi]
的意思是 : 重复执行 stos dword ptr [edi] 11h次 ,rep就是repeat
前面的 ecx 表示重复次数
0CCCCCCCCH 这个值表示未被初始化(初始化为0xcc, 使用这个值是因为0xcc对应汇编代码int 3,而且这个值很大容易引起程序员的注意,检查未初始化的问题)
总的来说即 从 ebp-44H 的地方向高地址的内存赋值,每次为四个字节赋值,每个字节赋值为 CCH,重复 11h 次 ,
执行完毕后 44h 的空间都是 CCh
从栈的情况可以推断出 存放下一条指令地址的寄存器 eip 的地址和 buffer[2] 的地址是相同的
在监视窗口中查看函数 jmp 的地址:
然后将 buffer[2] 赋值为 0x00401020 即可。
-------------------------------------分割线-------------------------------------------
buffer[2] = 0x00401020;//0x401020
和
buffer[2] = (int)jmp; //0x401005
的效果是一样的,但是两个的地址值却不相同
在汇编代码中分别查看两个地址对应的代码:
可以看到 00401005 处的只是一条跳转语句,跳转到 真实的 地址 00401020 去
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0 0
- 缓冲区溢出(1)
- 实践堆栈缓冲区溢出(1)
- 缓冲区溢出练习1
- (未完)缓冲区溢出
- 缓冲区溢出(笔记)
- 安全漏洞(缓冲区溢出)
- 缓冲区溢出漏洞(一):认识缓冲区溢出漏洞.
- 缓冲区溢出 学习总结1
- 什么是缓冲区溢出?(一)
- 什么是缓冲区溢出?(二)
- 缓冲区溢出笔记(2.0)
- 缓冲区溢出
- 缓冲区溢出
- 缓冲区溢出
- 缓冲区溢出
- 缓冲区溢出
- 缓冲区溢出
- 缓冲区溢出
- Java排序算法(十二):补充-洗牌算法
- Android Library Project:下拉刷新ListView
- 去哪儿网2015年春季校园招聘技术笔试题
- 建议7.1:恰当控制事务大小,commit不要过于频繁。
- iOS内存暴增问题追查与使用陷阱
- 缓冲区溢出(1)
- ACM--steps--dyx--1.3.5--开门人和关门人
- 华为机试 题目
- 学习C#视频总结
- 黑马程序员————Objective C——protocol、block
- Python之list 0.0
- 【BZOJ 1565】 [NOI2009]植物大战僵尸
- HTTP错误代码大全
- UVA 11796 - Dog Distance(计算几何)