C语言如何执行buf中的代码

2024-03-23 18:32
文章标签 语言 代码 执行 buf

本文主要是介绍C语言如何执行buf中的代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

strcpy(szBuf, “stricmp(“1”,“2”);”);
这里的szBuf只是保存了字符串值而已,并不是可执行的代码,从代码到可执行的二进制指令需要编译,亦或者通过解释执行.需要调用C编译器或解释器.
若要直接执行Buffer里面的代码必须是二进制指令.
这里提供一种可直接执行题主给的stricmp的例子:
x86
char szBuf[] = “\x8b\x44\x24\x04\x8b\x5c\x24\x08\x0f\xbe\x08\x85\xc9\x74\x0f\x0f\xbe\x13\x85\xd2\x74\x08\x3b\xca\x75\x04\x40\x43\xeb\xea\x0f\xbe\x08\x0f\xbe\x13\x2b\xca\x8b\xc1\xc3”;
调用:
int(_stricmp)(char[], char[]) = (int()(char[], char[]))&szBuf;printf("%d",_stricmp(“str1”, “str2”));
前提是szBuf的内存为可执行,Windows下使用VirtualProtectEx修改,Linux下使用mmap修改该内存位置为可执行.
Windows下的例子:

#include <stdio.h>#include <Windows.h>char szBuf[] = “\x8b\x44\x24\x04\x8b\x5c\x24\x08\x0f\xbe\x08\x85\xc9\x74\x0f\x0f\xbe\x13\x85\xd2\x74\x08\x3b\xca\x75\x04\x40\x43\xeb\xea\x0f\xbe\x08\x0f\xbe\x13\x2b\xca\x8b\xc1\xc3”;
int main(){
int(_stricmp)(char[], char[]) = (int()(char[], char[]))&szBuf;

DWORD OldProtect;
VirtualProtectEx(GetCurrentProcess(), \&szBuf, sizeof(szBuf), \PAGE_EXECUTE_READWRITE, \&OldProtect);printf("%d",_stricmp("str1", "str2"));VirtualProtectEx(GetCurrentProcess(), \&szBuf, sizeof(szBuf), \OldProtect, \NULL);return 0;}

szBuf里的代码对应的汇编如下:

	mov eax, [esp+0x04]mov ebx, [esp+0x08]__loop :movsx ecx, byte ptr[eax]test ecx, ecxje __exitmovsx edx, byte ptr[ebx]test edx, edxje __exitcmp ecx, edxjne __exitinc eaxinc ebxjmp __loop__exit :movsx ecx, byte ptr [eax]movsx edx, byte ptr [ebx]sub ecx, edxmov eax, ecxret

not about
https://www.jianshu.com/p/511fcb035fcb

这篇关于C语言如何执行buf中的代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/839166

相关文章

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

IDEA与MyEclipse代码量统计方式

《IDEA与MyEclipse代码量统计方式》文章介绍在项目中不安装第三方工具统计代码行数的方法,分别说明MyEclipse通过正则搜索(排除空行和注释)及IDEA使用Statistic插件或调整搜索... 目录项目场景MyEclipse代码量统计IDEA代码量统计总结项目场景在项目中,有时候我们需要统计

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

MySQL实现多源复制的示例代码

《MySQL实现多源复制的示例代码》MySQL的多源复制允许一个从服务器从多个主服务器复制数据,这在需要将多个数据源汇聚到一个数据库实例时非常有用,下面就来详细的介绍一下,感兴趣的可以了解一下... 目录一、多源复制原理二、多源复制配置步骤2.1 主服务器配置Master1配置Master2配置2.2 从服

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据