软件安全实验三——shellcode注入
一、 *实验目标*
- 了解shellcode注入原理
- 理解给出的弹出对话框的汇编代码
- 通过淹没静态地址来实现shellcod的代码植入
- 通过跳板来实现shellcode的代码入
- 尝试修改汇编语句的shellcode实现修改标题等 简单操作
二、 *测试步骤与结果*
- 创建可执行程序
- 运行程序成功后开始寻找dll中函数地址
运行dependency walker程序剖析exe文件
点 击 kernel32.dll , 在 右 侧 能 找 到exitprocess的函数入口点(右侧两个窗口中靠下的那个在下面的窗口中能够查到kernel32.dll的实际基址
两个地址相加即可得到exitprocess的入口地址: 0x0001B0BB+0x77E60000=0x77E7B0BB。
- 调试shellcode
新建工程文件,将code/shellcode文件夹中main.cpp的内容粘贴进新建的工程文件中
入口地址与刚才计算的一致,能够成功运行
- 使用ollydbg打开刚才生成的exe文件,找到编写shellcode的汇编语言
复制选定需要的部分:从xor ebx,ebx开始,到call eax结束(调用exit process的那个call eax),并右键保存到文件,
- 通过淹没静态地址来实现shellcode的代码植入
新建password文本文件
在ollydbg中打开overflow.exe,并在strcpy处设置断点
运行到断点处,指向地址0x0012FAF0,其为数组的存放起始位置,也就是shellcode注入的起始位置。
- 用Ultraedit在password.txt中写入payload,存储结构:shellcode+填充字符+shellcode在缓冲区的起始地址。其中shellcode为前面获得的操作码,填充字符应保证其与shellcode的和为52字节,shellcode缓冲区地址为dest指向地址
重新运行overflow.exe,可以看到弹出窗口,说明通过淹没静态地址成功实现了shellcode的代码
- 通过跳板来实现shellcode的代码植入
用ollydbg打开overflow.exe,在strcpy函数上设置断点,运行至断点,进行搜索
可以看到一条在user32.text中的JMP ESP指令的地址为0x77E2E32A。
- 打开password.txt,这次的文件结构为 52字节填充物 + 4字节JMP ESP地址(逆序)+ shellcode (可选 + 若干0x90)
输出成功
三、 *测试结论*
Shellcode攻击是通过利用计算机程序中的安全漏洞,将恶意代码注入到目标系统的内存中,然后利用该恶意代码来执行恶意操作,通过这一手段可以获取系统权限或者执行恶意操作,如植入后门、窃取信息等。这种攻击通常涉及精心构建的二进制代码,通常是汇编语言编写,用于利用特定漏洞来绕过系统的安全措施,然后执行攻击者所期望的操作。 Shellcode攻击是一种常见的攻击手法,通常需要深入了解目标系统的底层结构和漏洞,以便成功执行攻击。
通过这次测试,我深刻认识到了软件安全的重要性以及它所面临的巨大挑战。我们需要积极扩展知识储备,掌握更强大的安全工具,以便保护软件免受威胁。栈溢出漏洞在程序安全方面构成了严重威胁,因为它可以让攻击者通过不正当手段获取系统权限。因此,必须对保存在栈上的数据的可执行权限进行严格管理,并实施措施来检测和防范栈溢出漏洞,以确保系统的安全性。
四、 *思考题*
在不修改StackOverrun程序源代码的情况下,构造shellcode,通过JMP ESP的方式实现通过记事本打开shellcode.txt(可使用CreateProcessA或WinExec等API)。
- strcpy将输入的内容复制到栈中,导致栈溢出漏洞。另外main函数有两个参数,第一个参数int argc为传入的字符串个数,第二个参数是字符串指针数组,用于存放传入的字符串指针。
- 选用WinExec(“cmd.exe,SW_SHOWNORMAL”),其第一个参数为要打开的程序名称,第二个参数为窗口大小。当调用该命令时还需要加入cmd的参数,/k dir表示执行完dir命令后不关闭命令窗口,命令如下:WinExec(“cmd.exe /k dir > shellcode.txt”, SW_SHOWNORMAL)将WinExec的参数用十六进制表示
- 利用Dependency Walker获取WinExec函数的地址
根据地址计算到其真实地址0x0018601 + 0x77E60000 = 0x77E78601。
- 编写shellcode,并编译生成exe文件
打开刚刚生成的exe文件,找到对应的汇编语句,并右键复制到文件获取机器码
- 打开stackoverrun.exe,在strcpy函数处下断点,搜索JMP ESP
- 构造的payload
- 打开stackoverrun.exe,添加参数“payload”
- 重新运行程序,可以看到程序跳到了编写的shellcode汇编处结束
并且会自动打卡shellcode.exe文件