1.1.3-构造汇编语句

最近打算把《老码识途》搞一遍,就先拿这个构造汇编语句开刀吧。

1.1.3

在c语言里嵌入汇编语句,构造mov和jmp的机器指令,从而让程序按自己指定的路径跑。

见代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4
 5 int gi;
 6 void *address;
 7
 8 void *buildCode();
 9
10 int main(){
11     void *code=buildCode();
12     _asm {
13         mov address,offset _lb1
14     }
15     gi=12;
16     printf("gi=%d\n",gi);
17     _asm jmp code
18     gi=13;
19 _lb1:
20     printf("gi=%d\n",gi);//输出18
21     getchar();
22     return 0;
23 }
24 void *buildCode(){
25     char *code=(char *)malloc(16);
26     char *pMov=code;
27     char *pJmp=code+10;
28     char *pAddress;
29     //mov gi,18
30     pMov[0]=0xc7;
31     pMov[1]=0x05;
32     pAddress=pMov+2;
33     *((int *)pAddress)=(int)&gi;
34     *((int *)(pAddress+4))=18;
35     //jmp address
36     pJmp[0]=0xff;
37     pJmp[1]=0x25;
38     *((int *)(&pJmp[2]))=(int)&address;
39     return code;
40 }

buildCode()就是在code处构造两句汇编指令,从而运行_lb1处代码,输出18。

反汇编查看code处:

代码构造成功。

时间: 2025-01-04 21:10:38

1.1.3-构造汇编语句的相关文章

重读TCPL:从汇编语句浅析++i和i++

TCPL(The C Programming Language)对自增和自减运算符的叙述并不多.在中文版的12页(英文版18页)和37页(英文版46页)中,只是简单地标明TCPL这本书会同意使用前缀形式,并用一段话解释了两者对值和值+1先后的区别. 之所以纠结这个,是因为用C语言写单片机的程序的时候,有的老师会强调++i和i++在使用的时候没有区别.那这这两个语句在汇编层到底是怎样的呢? 用简单的几行代码测试了一下,代码如下: int main() { int a = 0, c = 0; c =

在c语言中嵌入汇编语句,对于我来说相当难。

今天早上在csdn论坛上看到一个帖子http://topic.csdn.net/u/20120917/14/82f42e17-977a-4824-95bd-7b79db15d283.html:“C语言中嵌入汇编,究竟有何意义?” 其中看到一个例子是在c语言中插入一段汇编代码获取CPU的主频,制造商和型号的: //=====================================================================================/*      

18.10 汇编语句

18.10.1 汇编语句中.equ的作用 1.定义静态符号 虽然数据段主要用于定义变量数据,但是也可以在这里声明静态数据符号. .equ命令用于把常量值设置为可以在文本段中使用的符号. 如: 01 .equ MEM_CTL_BASE, 0x48000000 02 .equ SDRAM_BASE, 0x30000000 经过设置之后,数据符号值是不能在程序中改动的. .equ命令可以出现在数据段中任何位置,但是好代码习惯,最好在定义其他数据之前或之后集中定义所有数据符号. 如: 01 ldr r2

Spring Boot 利用插件构造QueryDSL语句时报错:You need to run build with JDK or have tools.jar on the classpath.If this occur....

You need to run build with JDK or have tools.jar on the classpath.If this occures during eclipse build make sure you run eclipse under JDK as well (com.mysema.maven:apt-maven-plugin:1.1.3:process:default:generate-sources) 1. 仔细的看看自己的电脑的环境变量有没有配置错误,我的

PowerShell保存剪贴板图片并构造MarkDown语句

目标 最近在学着用MarkDown写文档,对传图片深恶痛绝.准备自己用PowerShell造个轮子,还好提前搜索,找到了很多大哥的文档. 整个要做的事情流程是 鼠标复制个剪贴板图片 进入程序处理逻辑 处理剪贴板图片,保存成本地文件(png或者jpg) 上传到一个图床,获取图床的连接 把图床的链接构造成MarkDown要求的格式,塞回剪贴板. 回到MarkDown编辑器,直接剪贴. 目标是2阶段的内容,完全用脚本实现. 实现 PowerShell对文件的操作进行创建修改是比较简单的,关键的地方在这

HITCTF2018

HITCTF的pwn部分 DragonBall 先按一般的流程来,首先分析一下程序功能: 通过买卖龙珠来集齐7颗龙珠,就可以许愿. 所以程序包含买.卖.显示龙珠数.许愿和退出五个功能 可以看到,buy函数有一个很明显的缺陷,就是在购买龙珠时,只判断钱数是否为零,所以只要钱数不为零,就可以无限购买,所以通过卖一颗来使钱数恒不等于零,从而买到七颗龙珠,可以许愿. 买到七颗龙珠之后就可以许愿,可以很明显的看到wish函数中的两次input有问题,第一次刚好没有覆盖到EBP,而第二次则刚好覆盖到返回地址

《懒人Shell脚本》之六——一键构造待采集批量sql语句

1.需求 采集任务构造入库.实现200多个网站的标题.时间.内容等信息的采集信息配置,并插入mysql中. 2.实现步骤 步骤1:人工实现Excel表格配置. 定义好唯一索引,如第一列的序号.好处: 1)序号可以成为mysql中的索引. 2)序号规定后,可以实现分布式,1个人4个小时.真正可以实现4个人1小时完成任务.(真正的分布式) 这点,非常重要. 关于索引,实践表明,对于每个网站入口唯一值的定义unique索引,能更进一步防止冲突,确保唯一. 步骤2:将表格存入到txt中. 在linux环

动态拼接liinq 使用Expression构造动态linq语句

最近在做动态构造linq语句,从网上找了很多,大多数,都是基于一张表中的某一个字段,这样的结果,从网上可以搜到很多.但如果有外键表,需要动态构造外键表中的字段,那么问题来了,学挖掘机哪家强?哦,不是,应该怎么做呢. 关于动态构造linq的,http://www.cnblogs.com/blusehuang/archive/2007/07/13/816970.html   该文章已经描述的很清楚了.我也不多说了. 其中,关键的代码是: Expression con = Expression.Cal

AT&amp;T x86_32 汇编_001_一个示例程序.md

这一节先写一个简单的汇编程序. 输出cpu的出产厂商. 不对语法, 寄存器等内容进行深入讨论, 只是整体上先有个认知印象. 1. 一些基础知识 简单来说, Linux下的可执行程序文件中, 最重要的三个部分是: 数据段, 代码段, bss段. 关于可执行文件, 以及目标文件的内容构成, 其实这是一个十分复杂的话题, 这里不进行深入讨论, 你可以简单的理解为: 可执行文件由段(section)组成. 每个可执行文件中存在多个段. 段是一种划分可执行二进制程序内容的手段 其中最重要的三个段: 数据段