码迷,mamicode.com
首页 > 其他好文 > 详细

20171121王朋伟《逆向进阶》实验报告

时间:2020-03-16 19:20:29      阅读:61      评论:0      收藏:0      [点我收藏+]

标签: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注入。以后放假的时候,我会进一步学习缓冲区溢出攻击的相关知识,学习如何绕过“堆栈执行保护”,使注入的机器指令能在不那么理想的环境下正确运行。

  本次实验让我受益匪浅,期待下次实验能让我对这门课程有更深的理解和感悟。

20171121王朋伟《逆向进阶》实验报告

标签:sas   函数   编译   终端   linux操作系统   软中断   收获   自己   ddr   

原文地址:https://www.cnblogs.com/loadingwangp/p/12505585.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!