寒水芊芊吧 关注:18贴子:298
  • 0回复贴,共1

缓冲区溢出学习笔记...(写错的地方大家多包含)

取消只看楼主收藏回复

以前总是在各个论坛看帖子~~ 前天黑手的缓冲区书到了~ 呵呵 
随便写点 可能有写错的地方 大家多指教啊`~  看的脑袋都大了  
太不好理解 

自从认识し掰搿嬲讎雠 以后才知道以前学的东西相当于幼儿园大班水平~~ 哈哈~  
这一个月全是在网上到处逛找些堆栈的文章看~~ 昨天黑客手册的缓冲区溢出的书到了。~`呵呵 作些笔记啥的~~ 复习复习~~  呵呵~~ 
#inclue<stdio.h> 
#include<sindows.h> 
char name[] ="xiaoyu"; 
int main() 

char output[8]; 
strcpy(output,name); 
for(int i=0;i<8&&output[i];i++) 
printf("\\0x%x",output[i]); 
return 0; 

#inclue<stdio.h> 
#include<sindows.h>这我不解释了~~ 头文件` 因为后面使用的strcpy跟printf要用到~ 
char name[]="xiaoyu" 是吧数组赋值~ 
char output[8]; 给output分配8个char空间 把name里的字符拷贝给它~ 
这样执行一下 只是把xiaoyu以16进制的形式打出来~~~ 没啥问题的``  要是把name里改长点~~改成 
1111111111111111111111111111111111111111111这样就会报错了`` 呵呵 最简单的溢出~` 

几个小知识`~ 虽然会了 但是还是写出来~~  关于PUSH跟POP 
堆栈就是先进后出~~ 这个概念大家都知道的~~ 在操作系统中~存和取的动作就是PUSH跟POP 
PUSH放进去一个~~POP取一个~~ 这么个概念~~ 
因为我们第二次输入了一堆11~~ 可是output分配的还是8个字节~~ 但是却拷贝了更多的近来~~   
当执行完main函数以后系统要恢复EBP EIP而EIP已经被我们覆盖了~~ 但是系统不知道 就会去执行那个东东 而那个位置是不可读的~~所以就会出错~` 呵呵  

2.shllcode 
啥叫shellcode呢~  其实我的理解就是把我们想要的程序称为shellcode  
比如我们想要的程序是开一个DOS窗口 就是下面这个程序 

#include<windows.h> 
int main() 

    LoadLibrary("msvcrt.dll"); 
    system("command.com"); 
    return 0; 

执行一下 呵呵 DOS窗口出来了~ 
因为system函数是由msvcrt.dll提供的 所以执行    system("command.com");首先要用LoadLibrary("msvcrt.dll")装载svcrt.dll 
其实不用LoadLibrary("msvcrt.dll");也可以调用system函数~  今天问了下 し掰搿嬲讎雠 他说有时候问了汇编方便还是需要的~  

现在我们把程序改为机器码  以前肯定看到很多比如\x01\xff\x3f\xff一类的东东 
那些就是程序的机器码 呵呵  也把我们的程序变成机器码吧 
在VC中直接按F10进行调试 然后在跳出的Debug工具栏里点最后一个Disassembly 这样就出现汇编代码了~~  



1楼2007-07-17 13:28回复