一、 *实验目标*

  1. 了解shellcode注入原理
  2. 理解给出的弹出对话框的汇编代码
  3. 通过淹没静态地址来实现shellcod的代码植入
  4. 通过跳板来实现shellcode的代码入
  5. 尝试修改汇编语句的shellcode实现修改标题等 简单操作

二、 *测试步骤与结果*

  1. 创建可执行程序

img

  1. 运行程序成功后开始寻找dll中函数地址

运行dependency walker程序剖析exe文件
img
点 击 kernel32.dll , 在 右 侧 能 找 到exitprocess的函数入口点(右侧两个窗口中靠下的那个在下面的窗口中能够查到kernel32.dll的实际基址
img
img
两个地址相加即可得到exitprocess的入口地址: 0x0001B0BB+0x77E60000=0x77E7B0BB。

  1. 调试shellcode

新建工程文件,将code/shellcode文件夹中main.cpp的内容粘贴进新建的工程文件中
img
入口地址与刚才计算的一致,能够成功运行
img

  1. 使用ollydbg打开刚才生成的exe文件,找到编写shellcode的汇编语言

img
复制选定需要的部分:从xor ebx,ebx开始,到call eax结束(调用exit process的那个call eax),并右键保存到文件,
img

  1. 通过淹没静态地址来实现shellcode的代码植入

新建password文本文件
img
在ollydbg中打开overflow.exe,并在strcpy处设置断点
img
运行到断点处,指向地址0x0012FAF0,其为数组的存放起始位置,也就是shellcode注入的起始位置。
img

  1. 用Ultraedit在password.txt中写入payload,存储结构:shellcode+填充字符+shellcode在缓冲区的起始地址。其中shellcode为前面获得的操作码,填充字符应保证其与shellcode的和为52字节,shellcode缓冲区地址为dest指向地址

img
重新运行overflow.exe,可以看到弹出窗口,说明通过淹没静态地址成功实现了shellcode的代码
img

  1. 通过跳板来实现shellcode的代码植入

用ollydbg打开overflow.exe,在strcpy函数上设置断点,运行至断点,进行搜索
img
img
img
可以看到一条在user32.text中的JMP ESP指令的地址为0x77E2E32A。

  1. 打开password.txt,这次的文件结构为 52字节填充物 + 4字节JMP ESP地址(逆序)+ shellcode (可选 + 若干0x90)

img
输出成功
img

三、 *测试结论*

Shellcode攻击是通过利用计算机程序中的安全漏洞,将恶意代码注入到目标系统的内存中,然后利用该恶意代码来执行恶意操作,通过这一手段可以获取系统权限或者执行恶意操作,如植入后门、窃取信息等。这种攻击通常涉及精心构建的二进制代码,通常是汇编语言编写,用于利用特定漏洞来绕过系统的安全措施,然后执行攻击者所期望的操作。 Shellcode攻击是一种常见的攻击手法,通常需要深入了解目标系统的底层结构和漏洞,以便成功执行攻击。

通过这次测试,我深刻认识到了软件安全的重要性以及它所面临的巨大挑战。我们需要积极扩展知识储备,掌握更强大的安全工具,以便保护软件免受威胁。栈溢出漏洞在程序安全方面构成了严重威胁,因为它可以让攻击者通过不正当手段获取系统权限。因此,必须对保存在栈上的数据的可执行权限进行严格管理,并实施措施来检测和防范栈溢出漏洞,以确保系统的安全性。

四、 *思考题*

在不修改StackOverrun程序源代码的情况下,构造shellcode,通过JMP ESP的方式实现通过记事本打开shellcode.txt(可使用CreateProcessA或WinExec等API)。

  1. strcpy将输入的内容复制到栈中,导致栈溢出漏洞。另外main函数有两个参数,第一个参数int argc为传入的字符串个数,第二个参数是字符串指针数组,用于存放传入的字符串指针。

img

  1. 选用WinExec(“cmd.exe,SW_SHOWNORMAL”),其第一个参数为要打开的程序名称,第二个参数为窗口大小。当调用该命令时还需要加入cmd的参数,/k dir表示执行完dir命令后不关闭命令窗口,命令如下:WinExec(“cmd.exe /k dir > shellcode.txt”, SW_SHOWNORMAL)将WinExec的参数用十六进制表示

img

  1. 利用Dependency Walker获取WinExec函数的地址

img
根据地址计算到其真实地址0x0018601 + 0x77E60000 = 0x77E78601。

  1. 编写shellcode,并编译生成exe文件

img
打开刚刚生成的exe文件,找到对应的汇编语句,并右键复制到文件获取机器码
img
img

  1. 打开stackoverrun.exe,在strcpy函数处下断点,搜索JMP ESP

img
img

  1. 构造的payload

img

  1. 打开stackoverrun.exe,添加参数“payload”

img

  1. 重新运行程序,可以看到程序跳到了编写的shellcode汇编处结束

img
并且会自动打卡shellcode.exe文件
img