本次实验分为三个模块:
(一)直接修改程序机器指令,改变程序执行流程;
(二)通过构造输入参数,造成BOF攻击,改变程序执行流;
(三)注入Shellcode并执行;
实验准备阶段:
1.将老师提供的pwn1文件通过共享文件夹传到kali上以便以后使用。
2.将pwn1文件复制到主目录下,并进行备份。
有关知识内容
1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
NOP汇编指令的机器码是“90”
JNE汇编指令的机器码是“75”
JE 汇编指令的机器码是“74”
JMP汇编指令的机器码是“eb”
CMP汇编指令的机器码是“39”
2.掌握反汇编与十六进制编程器
反汇编指令:objdump -dobjfile,关于其他用法可参考Linux下C程序的反汇编
关于管道,输入、输出重定向参考linux下输入输出重定向和管道符
十六进制编程器:用来以16进制视图进行文本编辑的编辑工具软件,其实我们只需要用各系统都兼容的vim编辑器就可以实现十六进制编辑的功能。具体步骤如下:
输入命令vi 20165330zyx查看可执行文件内容,发现大部分是我们没法理解的乱码;
按esc后在底行输入:%!xxd将显示模式切换为16进制模式;
进行相关操作后,输入:%!xxd -r转换16进制为原格式。
3.能正确修改机器指令改变程序执行流程
详见任务一
4.能正确构造payload进行bof攻击
详见任务二
任务一 (直接修改程序机器指令,改变程序执行流程)
当你拿到这个文件以后,放在你的虚拟机里面,你会发现他可能不是可执行文件(没有高亮):
(图一)
解决办法:chmod +x pwn1即可,执行之后文件变成高亮:
(图二)
第一个任务实际上就是:在main函数对子函数foo调用的时候,修改call指令跳转的地址,使其跳转到子函数shellcode处进行执行,从而达到获取shell的目的。
首先:objdump -d pwn1,反汇编pwn1文件。
反汇编结束后你发现:main函数里面有一步call 804891
进一步分析:08048491是,0804847d是我们的跳转目标。
0x08048491 - 0x0804847d = 0x00000014 //计算地址差
0xffffffd7 - 0x00000014 = 0xffffffc3 //计算要篡改的目标地址
(小端机器)
接着使用命令vi pwn1修改文件。
进入之后是乱码,使用:%!xxd转换为16进制显示。
使用/d7命令寻找e8d7ffffff机器指令所在地。
找到以后按i进入插入模式,修改d7为c3。
然后使用:%!xxd -r换回乱码的样子(不换回去会出问题),再用:wq保存即可。
这时如果再次objdump -d pwn1你能看到pwn1文件已经改了:
执行./pwn1文件可以成功获取shell:
至此第一个实验成功。