实践三
知识要求:
shellcode:指溢出后执行的能开启系统shell的代码。但是在缓冲区溢出攻击时,也可以将整个触发缓冲区溢出攻击过程的代码统称为shellcode,因此可以将shellcode分为以下4个部分:
1、核心shellcode代码,包含了攻击者要执行的所有代码。
2、触发shellcode的溢出地址。
3、填充物,填充未使用的缓冲区,一般使用nop指令填充——0x90表示。
4、结束符号0,对于符号串shellcode需要用0结尾,避免溢出时字符串异常。
5、linux下有两种构造shellcode的方法:retaddr+nop+shellcode;nop+shellcode+retaddr。
实践过程:
按照要求设置基本环境后开始(其中shellcode直接用的老师代码):
尝试第一种构造shellcode方法:retaddr+nop+shellcode
1、在一个终端中构造shellcode,并在终端中注入这段攻击(其中“\x4\x3\x2\x1”处是即将要填的shellcode起始地址),如下图所示:
2、打开另一个终端,查看./pwn进程的ID号,并进行gdb调试,如下图所示,可以看到ret地址是0x080484ae(ret后就会跳到即将要覆盖的返回地址的位置处):
3、开始在0x080484ae处设置断点,并不断向前查看地址知道找到shellcode起始地址,最终找到shellcode起始地址为0xffffd2e0(0xffffd2dc+4)。
4、将构造的shellcode中“\x4\x3\x2\x1”改为“0xffffd2e0”,结果不成功。
尝试第二种构造方法:anything+retaddr+nops+shellcode。
1、如下图“\x4\x3\x2\x1”处是即将要覆盖的shellcode返回地址为:0xffffd300。
2、构造shellcode:perl -e 'print "A" x 32;print "\x00\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\xe0\xd2\xff\xff\x00"' > input_shellcode
最终成功。如下图: