20242909 2024-2025-2 《网络攻防实践》实践九报告

20242909 2024-2025-2 《网络攻防实践》实践九报告

1.实践内容

1.1 实践目标

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

1.2 三个实践内容如下:

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

1.3 实验要求

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

1.4 相关知识梳理总结

1.4.1 汇编

汇编语言是一种面向机器的低级语言,与特定CPU架构紧密相关(如x86、x64、ARM等)。它是介于机器码与高级语言之间的桥梁,使用助记符表示指令(如mov、jmp、call等),便于人类阅读和编写。汇编代码经过汇编器(如nasm、masm)转换成二进制机器码,最终被CPU执行。

1.4.2 反汇编

反汇编是指将二进制可执行文件还原为汇编代码的过程。
常用工具包括IDA Pro、Ghidra、objdump、radare2等。
反汇编的目的是让分析者能够理解程序执行流程、函数调用、关键逻辑和潜在漏洞,在缺乏源代码的情况下进行逆向分析。

1.4.3 shellcode

Shellcode 是一段用汇编语言编写的、以机器码形式存在的可执行代码,它的目的是:在目标程序被攻击成功后,劫持程序流程并执行攻击者指定的操作。这个名字来源于它最初常用于弹出命令行Shell(如/bin/sh),但现代Shellcode已经远不止于此。shellcode的典型功能有:

  • 获取系统权限(如提权、添加管理员)
  • 建立远程连接(反弹Shell、绑定Shell)
  • 下载并执行恶意程序(Dropper行为)
  • 关闭安全机制、防病毒进程
  • 留下后门、键盘记录、信息窃取等

2.实践过程

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

将老师提供的存有linux可执行文件的文件夹拷贝到kali虚拟机中,文件夹、文件名以及kali虚拟机的名称均已修改为带有个人信息的名称

进入文件夹后打开终端输入命令objdump -d pwn20242909wty | more,对可执行文件pwn20242909wty进行反汇编

继续下拉显示更多信息,找到getshell、foo、与main函数。由主函数我们可以看出main函数调用foo,相应的机器指令为“e8 d7ffffff”,其中e8为跳转的意思。d7ffffff是补码,表示-41,即为目标地址偏移量,41的十六进制为0x29,80484ba+d7ffffff= 80484ba-0x29=8048491,即为跳转的目标地址。若调用getShell,可以修改“d7ffffff”为,"getShell-80484ba"对应的补码就行。804847d-80484ba计算得到补码c3ffffff

使用vim打开文件,输入指令:%!xxd以十六进制形式查看

找到目标代码所在的位置,将d7ffffff修改为c3ffffff,输入:%!xxd -r恢复为原格式后退出

再次对文件进行反汇编找到main函数,发现修改成功

2.2 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数

重新拷贝一份文件到kali虚拟机中,输入命令objdump -d pwn20242909wty | more反汇编未修改过的文件

安装gdb工具后输入命令gdb pwn20242909wty进入gdb模式

输入r执行程序,连续输入5遍1234567890共50个字符,在输入info r查看寄存器信息,查看到eip寄存器的内容为0x36353433,查阅ASCII码表后发现对应的是6543,又由小端存储可知对应输入的3456,所以之前的内容到2存入了缓冲区,由此判断出缓冲区的大小为32byte

函数getshell的地址为0804847d,由于小端模式要倒过来输入,应当写入11111111222222223333333344444444\x7d\x84\x04\x08,输入命令”perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > wty_input“将要写入的字符串存到wty_input文件中

输入命令(cat wty_input; cat) | ./pwn20242909wty,将wtu_input中的内容注入到pwn20242909wty中

2.3 注入一个自己制作的shellcode并运行这段shellcode

在kali虚拟机下载execstack压缩包并解压安装

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

输入命令more /proc/sys/kernel/randomize_va_space查看地址随机化的状态,结果显示为2,是开启状态。输入命令echo "0" > /proc/sys/kernel/randomize_va_space关闭地址随机化并再次输入命令查看状态,结果显示是0,地址随机化已关闭

如上图所示输入命令构建字符串并保存到wty_input_shellcode中

输入命令(cat wty_input_shellcode; cat) | ./pwn20242909wty将wty_input_shellcode的内容注入到pwn20242909wty中

打开另一个终端,切换到root权限后输入命令ps -ef | grep pwn20242909wty查看到pwn20242909wty的端口号为90770

在另一个终端进入gdb调试,输入attach 90770,然后输入disassemble foo,接着输入break *0x080484ae设置断点

输入c继续运行,接着输入info r esp查看栈顶指针所在的位置为0xffffd34c,由此计算0xffffd34c+0x00000004=0xffffd350

输入命令构建wty_input_20242909文件,最后执行 (cat wty_input_20242909;cat) | ./pwn20242909wty,这时候已经调用了getShell函数

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

  • 问题1:在实验过程2.1中替换调用函数的地址后文件无法再次进行反汇编,显示报错无法识别
  • 问题1解决方案:判断为在使用vim修改文件内容时不小心更改了其他内容导致文件不可反汇编,重新拷贝文件后仔细修改内容后问题解决

4.实践总结

这次的实践作业涉及汇编与反汇编的理论知识和实践操作,尽管曾经学习过汇编语言相关的课程知识,但真正上手实操的时候还是有些笨拙,需要根据他人的教程一步一步理解来做。通过这次实验对于缓冲区溢出攻击有了更加直观的认识,之前学习C语言编程时学习过数组越界时可能造成缓冲区溢出,在这次实践中理解变得更加深刻。

参考资料

posted @ 2025-05-14 20:55  Euphoria315  阅读(79)  评论(0)    收藏  举报