当前位置: 首页 > news >正文

启东住房和城乡建设局网站wordpress仿微信播放器

启东住房和城乡建设局网站,wordpress仿微信播放器,三门峡市建设局官方网站,做试题网站前言 近些日子在很多线上比赛中都遇到了smc文件加密技术,比较出名的有Hgame杭电的比赛,于是我准备实现一下这项技术#xff0c;但是在网上看了很多文章#xff0c;发现没有讲的特别详细的#xff0c;或者是无法根据他们的方法进行实现这项技术#xff0c;因此本篇文章就是…前言 近些日子在很多线上比赛中都遇到了smc文件加密技术,比较出名的有Hgame杭电的比赛,于是我准备实现一下这项技术但是在网上看了很多文章发现没有讲的特别详细的或者是无法根据他们的方法进行实现这项技术因此本篇文章就是分享我在学习以及尝试smc文件加密技术时所遇到的麻烦以及心得。 该篇文章将会从我学习这项技术的视角讲述我屡次失败的经历一点点深入。 SMC局部代码加密技术简介: SMCSoftware-Based Memory Encryption是一种局部代码加密技术它可以将一个可执行文件的指定区段进行加密使得黑客无法直接分析区段内的代码从而增加恶意代码分析难度和降低恶意攻击成功的可能性。 SMC的基本原理是在编译可执行文件时将需要加密的代码区段例如函数、代码块等单独编译成一个section段并将其标记为可读、可写、不可执行readable, writable, non-executable然后通过某种方式在程序运行时将这个section解密为可执行代码并将其标记为可读、可执行、不可写readable, executable, non-writable。这样攻击者就无法在内存中找到加密的代码从而无法直接执行或修改加密的代码。 SMC技术可以通过多种方式实现例如修改PE文件的Section Header、使用API Hook实现代码加密和解密、使用VMProtect等第三方加密工具等。加密时一般采用异或等简单的加密算法解密时通过相同的算法对密文进行解密。SMC技术虽然可以提高恶意代码的抗分析能力但也会增加代码运行的开销和降低代码运行速度。 具体来说SMC实现的主要步骤包括 读取PE文件并找到需要加密的代码段。将代码段的内容进行异或加密并更新到内存中的代码段。重定向代码段的内存地址使得加密后的代码能够正确执行。执行加密后的代码段。 SMC的优点在于 SMC采用的是软件实现方式因此不需要硬件支持可以在任何平台上运行。SMC对于程序的执行速度影响较小因为代码解密和执行过程都是在内存中进行的。SMC可以对代码进行多次加密增加破解的难度。SMC可以根据需要对不同的代码段进行不同的加密方式从而提高安全性。 然而SMC的缺点也显而易见主要包括 SMC的实现比较复杂需要涉及到PE文件结构、内存管理等方面的知识。SMC需要在运行时动态地解密代码因此会对程序的性能产生一定的影响。SMC只能对静态的代码进行加密对于动态生成的代码无法进行保护。SMC对于一些高级的破解技术如内存分析可能无法完全保护程序。 综上所述SMC是一种局部代码加密技术可以提高程序的安全性但也存在一些局限性。在实际应用中需要根据具体的情况选择最合适的保护方案综合考虑安全性、性能和可维护性等因素。 [流程图] --------------------- | 读取PE文件 | | 找到代码段 | --------------------- | | v --------------------------------- | 对代码段进行异或加密 | | 并更新到内存中的代码段 | --------------------------------- | | v --------------------------------- | 重定向代码段的内存地址 | | 使得加密后的代码能够正确执行 | --------------------------------- | | v --------------------- | 执行加密后的代码段 | ---------------------[小结一下] 前面说的非常的高端其实通俗的讲就是程序可以自己对自己底层的字节码进行操作就是所谓的自解密技术。其在ctf比赛中常见的就是可以将一段关键代码进行某种加密然后程序运行的时候就直接解密回来,这样就可以干扰解题者的静态分析,在免杀方面也是非常好用的技术。可以利用该技术隐藏关键代码。 言归正传 如何实现这项技术 说实话实现这项技术我是踩了非常多的坑的接下来将会一一分享。 用伪代码解释一下该技术: proc main: ............ IF .运行条件满足CALL DecryptProc Address of MyProc//对某个函数代码解密........CALL MyProc //调用这个函数........CALL EncryptProc Address of MyProc//再对代码进行加密防止程序被Dump...... end mainOK非常明确首先我是使用了Dev-C 6.7.5编译器,使用的MinGW GCC 9.2.0 32bit Debug的编译规则。 帮助网安学习全套资料S信免费领取 ① 网安学习成长路径思维导图 ② 60网安经典常用工具包 ③ 100SRC分析报告 ④ 150网安攻防实战技术电子书 ⑤ 最权威CISSP 认证考试指南题库 ⑥ 超1800页CTF实战技巧手册 ⑦ 最新网安大厂面试题合集含答案 ⑧ APP客户端安全检测指南安卓IOS 我们回忆一下该项技术加入我们需要加密的是函数fun那么我们首先需要使用指针找到fun的地址一开始我使用的是int类型的指针代码如下 void fun() {char flag[]flag{this_is_test};printf(%s,flag); } int main () {int *a(int *)fun;for(int i 0 ; i 10 ; i ){printf(%x ,*(a));} }输出结果为: 83e58955 45c738ec 616c66e5 e945c767 6968747b 73ed45c7 c773695f 745ff145 c7667365 7d74f545然后我们把编译出来的文件放到ida里面观察 可以发现输出的内容确实是fun的字节码,但是由于int在c语言中占用了四个字节,因此是由四个16进制的机器码根据小端序排列输出的那么为了解决这种连续字节码的问题我们需要找到一个只占用一个字节的指针首先我想到了char类型于是我马上更改代码使用char类型的指针得到了如下的输出结果。 55 ffffff89 ffffffe5 ffffff83 ffffffec 38 ffffffc7 45 ffffffe5 66显然这里是忽略的char的符号位的问题有符号char型如果最高位是1意思是超过了0x7f当%X格式化输出的时候则会将这个类型的值拓展到int型的32位所以才会出现0xff被扩展为ffffffff。 一筹莫展之际我想起了在c语言中还有一种数据类型是只占一个字节的那就是byte类型的数据将代码改成byte类型之后可以发现输出变得正常了。 输出为: 55 89 e5 83 ec 38 c7 45 e5 66这个就是正确的字节码的形式了。 那么我们需要定位到程序段进行加密了,由于本次只是实验我们采取简单的异或加密方式异或加密的特点就是加密函数也可以是解密函数,极大的方便了我们此次实验。我们可以先在ida中看到我们需要加密的程序段的位置。 在ida中我们可以发现我们需要解密的fun函数占用的地址段是0x00401410-00401451,那我们只需要将这一段内存中的机器码进行异或加密理论上就可以实现smc文件加密技术了。 实现代码如下 void fun() {char flag[]flag{this_is_test};printf(%s,flag); } int main () {byte *a(byte *)fun;byte *b a ;for( ; a!(b0x401451-0x4014101) ; a ){*a*a^3;}fun(); }这段代码直接运行的话会出现内存错误这是因为代码运行的时候对原本未被加密的fun函数进行了异或处理导致本来应该是解密的操作变成了加密操作然后机器无法识别该段内存就出现了内存错误因此在运行代码前我们需要将文件中的fun函数部分进行加密操作。我这里使用idapython对字节码进行操作然后将文件dump出来完成对文件的加密。 idapython脚本为: for i in range(0x401410,0x401451):patch_byte(i,get_wide_byte(i)^3)运行后把代码dump下来再运行 发现出现内存错误告警猜测可能是dev-c的编译器开启了随机基地址和数据保护,因此选择更换编译器并关闭随机基地址选项。这里使用的是visual studio 201932位的debug模式进行编译 但是遗憾的是仍然无法运行思考了一会儿之后发现可能是该段内存没有被设置成可读、可执行、可写入导致程序无法识别这段内存了因此我们改变方法使用程序段的概念通过对整个程序段进行加密解密来实现smc技术。 使用的代码是: #includeWindows.h #includestring #includestring.h using namespace std; #include iostream#pragma code_seg(.hello) void Fun1() {char flag[]flag{this_is_test};printf(%s,flag); } #pragma code_seg() #pragma comment(linker, /SECTION:.hello,ERW)void Fun1end() {}void xxor(char* soure, int dLen) //异或 {for (int i 0; i dLen;i){soure[i] soure[i] ^3;} } void SMC(char* pBuf) //SMC解密/加密函数 {const char* szSecName .hello;short nSec;PIMAGE_DOS_HEADER pDosHeader;PIMAGE_NT_HEADERS pNtHeader;PIMAGE_SECTION_HEADER pSec;pDosHeader (PIMAGE_DOS_HEADER)pBuf;pNtHeader (PIMAGE_NT_HEADERS)pBuf[pDosHeader-e_lfanew];nSec pNtHeader-FileHeader.NumberOfSections;pSec (PIMAGE_SECTION_HEADER)pBuf[sizeof(IMAGE_NT_HEADERS) pDosHeader-e_lfanew];for (int i 0; i nSec; i){if (strcmp((char*)pSec-Name, szSecName) 0){int pack_size;char* packStart;pack_size pSec-SizeOfRawData;packStart pBuf[pSec-VirtualAddress];xxor(packStart, pack_size);return;}pSec;} }void UnPack() //解密/加密函数 {char* hMod;hMod (char*)GetModuleHandle(0); //获得当前的exe模块地址SMC(hMod); } int main() {//UnPack();UnPack(); //Fun1();return 0; }如此操作后做一个简单的验证看看能不能成功就是进行两次调用unpack函数来看看程序能否正常运行发现程序成功的输出了flag那么使用程序段的方式是正确的 这段代码实现了一个简单的SMC自修改代码技术主要包括以下几个部分 使用 #pragma code_seg 指令将 Fun1() 函数代码段定义为一个名为 “.hello” 的新代码段使其与其他代码段隔离开来方便后面的加密和解密。使用 #pragma comment(linker, “/SECTION:.hello,ERW”) 指令将 “.hello” 代码段设置为可读、可执行、可写入的以便后面的加密和解密操作。定义 Fun1end() 函数作为 Fun1() 函数的结束点以便后面的加密操作。定义 xxor() 函数用于将指定的字符串进行异或加密/解密。定义 SMC() 函数该函数用于解密指定代码段的内容。具体操作是遍历 PE 文件的各个段找到指定代码段并对其进行解密。定义 UnPack() 函数该函数用于对当前进程的代码段进行解密操作。具体操作是获取当前模块的句柄读取模块的 PE 文件并对指定代码段进行解密。在 main() 函数中调用 UnPack() 函数进行解密操作然后调用 Fun1() 函数进行计算。 需要注意的是这段代码只是一个简单的示例实际应用中可能需要更加复杂的加密和解密方法以及更多的安全措施来保护代码的安全性。同时SMC自修改代码技术也存在一定的风险和挑战需要仔细评估和规划谨慎使用。 代码写好之后仍然需要我们自己手动先加密程序在别的文章中所使用的方法和工具我找了很久都没有找到因此决定自己使用idaidapython来实现对程序的加密最后dump出程序然后程序运行时会自己进行解密。 ida中的hello程序段 我们需要的是将所有hello程序段的内容进行加密。 idapython脚本: for i in range(0x417000,0x4170A4):patch_byte(i,get_wide_byte(i)^3)虽然dump出来的程序能输出我们程序中的值但是仍然出现了堆栈不平衡的问题因此在终端运行程序时仍然会爆出内存错误的告警研究到此时我已经心态崩了,找了很多大牛的博客都没有详细提到怎么实现加密程序那这样的话只能自己手撸了这里使用python语言代码为: import pefiledef encrypt_section(pe_file, section_name, xor_key):加密PE文件中指定的区段# 找到对应的sectionfor section in pe_file.sections:if section.Name.decode().strip(\x00) section_name:print(f[*] Found {section_name} section at 0x{section.PointerToRawData:08x})data section.get_data()encrypted_data bytes([data[i] ^ xor_key for i in range(len(data))])pe_file.set_bytes_at_offset(section.PointerToRawData, encrypted_data)print(f[*] Encrypted {len(data)} bytes at 0x{section.PointerToRawData:08x})returnprint(f[!] {section_name} section not found!)if __name__ __main__:filename test1.exe#加密文件的名字,需要在同一根目录下section_name .hello#加密的代码区段名字xor_key 0x03#异或的值print(f[*] Loading {filename})pe_file pefile.PE(filename)# 加密print([*] Encrypting section)encrypt_section(pe_file, section_name, xor_key)# 保存文件new_filename filename[:-4] _encrypted.exeprint(f[*] Saving as {new_filename})pe_file.write(new_filename)pe_file.close() 这段代码实现了对PE文件中指定的代码区段进行异或加密的功能具体解释如下 导入pefile模块该模块提供了解析PE文件格式的功能定义encrypt_section函数该函数接收三个参数分别是PE文件对象pe_file、待加密区段名称section_name和异或值xor_key。函数首先遍历PE文件中的所有区段查找名字为section_name的区段对指定的代码区段进行加密如果找到了名字为section_name的代码区段该函数调用PE文件对象的set_bytes_at_offset方法将指定区段中的每个字节和异或值异或得到加密后的数据并将加密后的数据写回指定区段。注意set_bytes_at_offset方法需要传入一个字节串作为参数因此需要将加密后的数据转换为字节串main函数该函数首先指定待加密的PE文件名filename、待加密的区段名称section_name和异或值xor_key。然后它创建一个PE文件对象pe_file读入PE文件接着调用encrypt_section函数对指定区段进行加密最后将加密后的文件写入新的文件中并关闭PE文件对象。 这段代码的执行过程如下 调用main函数读取PE文件test1.exe找到名字为.hello的区段对其中的每个字节和异或值0x03进行异或得到加密后的数据将加密后的数据写回.hello区段并将加密后的文件保存为test1_encrypted.exe。 脚本完成后满怀激动的运行它 成功了 终端也成功的运行出了加密后的程序我们再到ida中观察它 成功的无法静态分析。那么至此我们就成功的实现了该项技术! CTF实战 SMC 技术在 CTF 比赛中有很多应用主要是用来对抗反调试和反编译等工具的逆向分析。下面是几个常见的应用场景 局部代码加密CTF 比赛中有很多加密的二进制程序利用 SMC 技术可以对程序的关键代码进行加密增加分析难度提高程序的安全性。加密字符串和常量CTF 比赛中有很多加密的字符串和常量这些字符串和常量通常用来存储关键信息如密钥、密码等。利用 SMC 技术可以对这些字符串和常量进行加密增加分析难度提高程序的安全性。防止调试CTF 比赛中有很多程序会使用调试器进行逆向分析利用 SMC 技术可以对程序进行调试器检测和防御防止调试器的使用。防止反编译CTF 比赛中有很多程序会被反编译利用 SMC 技术可以对程序进行反编译检测和防御防止程序被反编译。 总之SMC 技术在 CTF 比赛中是一个非常有用的技术可以用来保护程序的安全性增加分析难度提高程序的安全性。 [Hgame2023]patchme 点开文件可以看到一个可疑函数对文件地址进行操作,怀疑是smc文件加密技术 跟踪过去看一看 发现地址爆红出现大量没有被解析的数据段 那么实锤此处就是smc文件加密那么我们将其异或回去使用idc或者idapython 运行idapython脚本之后发现本来ida无法识别的汇编代码变得可以识别了那么我们声明所有的未声明函数 就可以在下面找到输出flag的方法了 EXP #includeiostream #includealgorithm #includecstdio #includecmath #includemap #includevector #includequeue #includestack #includeset #includestring #includecstring #includelist #includestdlib.h using namespace std; typedef int status; typedef int selemtype; int ida_chars[] {0xFA, 0x28, 0x8A, 0x80, 0x99, 0xD9, 0x16, 0x54,0x63, 0xB5, 0x53, 0x49, 0x09, 0x05, 0x85, 0x58,0x97, 0x90, 0x66, 0xDC, 0xA0, 0xF3, 0x8C, 0xCE,0xBD, 0x4C, 0xF4, 0x54, 0xE8, 0xF3, 0x5C, 0x4C,0x31, 0x83, 0x67, 0x16, 0x99, 0xE4, 0x44, 0xD1,0xAC, 0x6B, 0x61, 0xDA, 0xD0, 0xBB, 0x55 }; int c[]{0x92, 0x4F, 0xEB, 0xED, 0xFC, 0xA2, 0x4F, 0x3B,0x16, 0xEA, 0x67, 0x3B, 0x6C, 0x5A, 0xE4, 0x07,0xE7, 0xD0, 0x12, 0xBF, 0xC8, 0xAC, 0xE1, 0xAF,0xCE, 0x38, 0x91, 0x26, 0xB7, 0xC3, 0x2E, 0x13,0x43, 0xE6, 0x11, 0x73, 0xEB, 0x97, 0x21, 0x8E,0xC1, 0x0A, 0x54, 0xAE, 0xB5, 0xC9,0x28 }; int main () {for(int i 0 ; i 46 ; i ){printf(%c,ida_chars[i]^c[i]);} }
http://www.hkea.cn/news/14351731/

相关文章:

  • 网站建设优化兼职在家学校网站建设的意义与途径
  • 做网站实名认证总是失败怎么回事企业绿色发展助力
  • 360网站推广官网怎么优化西安网站建设seo
  • 彩票网站建设网站单页建站系统
  • 网站建设交流论坛装修设计学校排行榜
  • 网站之家查询WordPress启用插件
  • 织梦 图片网站源码wordpress+显示异常
  • 做网站赚大钱重庆律师网站
  • 外贸在线网站建站湖北省建设人力资源网站首页
  • 佛山网站建设企业php网站开发范例
  • 与通信工程专业做项目的网站免费公司logo设计
  • 梅河口市建设局网站可以免费建网站的
  • 商会网站怎么做深圳网站建设哪家口碑好
  • 可做产品预售的网站工信部查询网站备案
  • 专业的建设网站服务公司网站设置在哪里找
  • 有几个网站能在百度做推广wordpress如何自己添加锚文本
  • 做硅胶的网站天眼查询个人信息官网
  • 目前做哪些网站致富河南郑州旅游网站设计
  • 如何购物网站建设怎么制作网站卖东西
  • wordpress 命令执行网站标题seo外包优化
  • 旅游公司的网站怎么做淘宝推广软件哪个好
  • 织梦网站修改教程视频重庆网站建设多少钱
  • 网站风格一般具有哪三大特征游戏网站制作模板
  • 网站开发公司巨推青岛新公司网站建设推广
  • 局域网网站域名怎么做个人如何注册微信公众号怎么创建
  • 用rem做移动网站做肥料网站
  • 网站的重要性个人网站设计需求分析
  • 物流手机网站模板国外工装设计网站大全
  • 做公司网站要素商城微网站建设多少钱
  • 如何学习网站建设appphp 建设网站