标签:sas 函数 编译 终端 linux操作系统 软中断 收获 自己 ddr
一、实验名称
逆向进阶
二、实验目的和内容
第一个实践是在非常简单的一个预设条件下完成的:
(1)关闭堆栈保护
(2)关闭堆栈执行保护
(3)关闭地址随机化
(4)在x32环境下
(5)在Linux实践环境
自己编写一个64位shellcode。参考shellcode指导。
自己编写一个有漏洞的64位C程序,功能类似我们实验1中的样例pwn1。使用自己编写的shellcode进行注入。
三、基础知识与实验准备
1.shellcode的编写流程
(1)编写汇编源码,汇编,链接,生成可执行文件,运行该文件,观察结果是否如预期
(2)反汇编,从可执行文件中提取机器指令数组
(3)在C中直接调用该机器指令,验证提取的机器指令数组是否可正确运行
2.为保证攻击成功,关闭部分Bof攻击防御技术
(1)设置堆栈可执行
(2)关闭地址随机化
3.选用retaddr+nop+shellcode的构造进行攻击
4.Linux操作系统32位和64位的部分区别
(1)32位系统在汇编时需要加入参数elf32,在链接时需要加入elf_i386
(2)64位系统中,不使用软中断int 0x80来进行系统调用,而是用syscall指令
(3)64位系统有16个寄存器,32位只有8个。但是32位的8个寄存器都有不同的命名,分别是e__,而64位使用了r代替e,也就是r__,其剩下的8个寄存器的命名则是从r8至r15。
四、实验步骤
1.编写汇编源码(因为只在上本门课的时候听老师讲过一点汇编语言的知识,没有系统学习过,所以在“exploit-db shellcode汇总”网站上找了一段符合实验要求的汇编源码)
代码功能是实现返回可用的shell
2.汇编、链接,生成可执行文件getshell_64,运行该文件,观察结果如预期所示
3.反汇编,从可执行文件中提取机器指令数组
4.在C中直接调用该机器指令,验证提取的机器指令数组是否可正确运行
编译时要注意使用“-z execstack”设置堆栈可执行
5.编写一段有缓冲区溢出攻击漏洞的64位C程序wpw.c,并编译成wpw.bin,设置wpw.bin堆栈可执行,关闭地址随机化。
6.输入“objdump -d wpw.bin | more”对wpw.bin反汇编,由“lea -0x20(%rbp),%rax”发现foo函数的缓冲区长度是0x20(即十进制32个字节),加上堆栈中存放main函数的rbp地址所占的8个字节(64位系统,地址为8个字节),共40个字节,所以确定输入字符串的第41-48个字节会覆盖到堆栈上的返回地址。
7.确认可执行文件wpw.bin是ELF 64-bit的
8.输入“(cat input_getshell;cat) | ./wpw.bin”后在另一个终端打开调试界面,找到foo栈帧中的返回地址。输入“ps -ef | grep wpw.bin”找到wpw.bin的进程号为2408,再使用gdb工具调试wpw.bin,输入“disassemble foo”对foo函数反汇编,将断点放在retq之前。回原终端按下回车(即字符串输入结束),再回来输入c继续执行。使用“info r rsp”查看rsp寄存器的地址为0x7fffffffe1b8,发现该地址+8后即为空操作的地址(0x7fffffffe1c0),将地址换至input_getshell文件中。
使用retaddr+nop+shellcode结构
9.最后输入“(cat input_getshell;cat) | ./wpw.bin”,将input_getshell文件的内容作为wpw.bin的输入,成功实现了调用注入的shellcode,返回可用的shell。
五、实验收获与感想
通过本次网络对抗技术实验,我对Linux32位系统和64位系统的区别有了些许了解,掌握了shellcode的编写流程,能较为熟练使用已编写好的汇编指令实现32位或64位系统的shellcode注入。以后放假的时候,我会进一步学习缓冲区溢出攻击的相关知识,学习如何绕过“堆栈执行保护”,使注入的机器指令能在不那么理想的环境下正确运行。
本次实验让我受益匪浅,期待下次实验能让我对这门课程有更深的理解和感悟。
标签:sas 函数 编译 终端 linux操作系统 软中断 收获 自己 ddr
原文地址:https://www.cnblogs.com/loadingwangp/p/12505585.html