Exp1 PC平台逆向破解
1,掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
NOP:空指令,作用就是直接跳到下一指令。机器码为:90。
JNE:判断0标志位,不等于0跳转。机器码为:75。
JE:判断0标志位,等于0跳转。机器码为:74。
JMP:无条件跳转。机器码为:eb。
CMP:比较后面两个值,即第一个减第二个,只影响标志位。机器码为:83。
2,掌握反汇编与十六进制编程器
反汇编:objdump 加各种参数,管道符号,重定向符等,这里不一一列出。
十六进制编程器:
3,能正确修改机器指令改变程序执行流程。
由图可知foo函数的地址为8048491,getshell为804847d,用windows下程序员计算器16进制相减=14,d7-14=c3;因此将d7位置改为c3。
先vi 进入可执行文件,再%!xxd转为16进制,找到d7改为c3,最后%!xxd -r 转回去wq保存。当然该过程也可通过16进制编程器进行。
结果如下:
4,能正确构造payload进行bof攻击。
(1)通过构造输入参数,造成BOF攻击,改变程序执行流。
需要进行攻击的函数反汇编代码如下:
由代码可知,第一行代码将原函数栈底指针压栈,第二行代码用esp和edp两指针来开始操作foo函数,第三行esp移动到0x38位置,第四五行则是把eax和esp移动到0x1c的位置,第六行通俗的讲就是一个写入函数,把我的输入从0x1c写到0x38的位置,到这里后面的输出等代码就可不用分析,就已经找到缓冲区的大小了,即0x38-0x1c=28字节,然后加上存储下一条指令的寄存器的大小4字节,总计32字节。
结果如下:
当然,无法直观分析出缓冲区大小的话,可以通过gdb调试慢慢套出来。如下图:可见1234出了问题。
(2)注入shellcode并执行。
直接使用实验中给的shellcode,如下:
x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80
先做好准备工作:
采用nop+shellcode+retaddr方法,确定返回值的地址。
方法为通过
perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
注入,再用gdb调试,找到1234的位置,我的如图所示:
可见01020304就在0xffffd2fc附近,加4得0xffffd300,则该位置为我的shellcode得起始位置。
因此构建以0xffffd300为返回位置的shellcode,成功。如图:
实验收获与感想
虽说这次实验比较简单,但收获相当大。
一是课堂上有些没弄明白的地方,通过自己做实验都弄明白了。
二是发现了一个有趣的东西,如下图:
尽管第二个的机械码一看就有点问题,但还是不清楚为什么会出现这种情况。
三是通过自学汇编,已经能够分析出本次实验的缓冲区大小。
什么是漏洞?漏洞有什么危害?
我认为漏洞就是系统,软件乃至硬件存在的在设计过程中的或者在协议通信过程中等方面存在的不安全,易被别人用来进行破坏或牟利的东西。
危害:可能会导致泄露隐私,系统或文件遭到加密或破坏,cpu被他人利用。