滴水逆向三期笔记与作业——02C语言——05 正向基础/05 循环语句
目录
- 一、缓冲区溢出的HelloWorld
- 二、永不停止的HelloWorld
- 三、基础知识
- 3.1 变量的声明
- 3.2 类型转换(一般用于小转大)
- 3.3 表达式
- 3.4 语句和程序块
- 3.5 参数与返回值
- 3.6 关系运算符
- 3.7 逻辑运算符:&& || !
- 3.8 单目运算符
- 3.9 三目运算符
- 四、作业
- 1、交换两个变量值
- 2、将一个数组中的数倒序输出
- 3、找出数组里面最大的值,并返回
- 4、将数组所有的元素相加,将结果返回
- 5、将两个等长数组相同位置的值相加,存储到另外一个等长的数组中
- 6、写一个函数int prime(int x),如果x是素数返回值为1,否则返回0
- 7、俩俩比较数组的值,将最大的一个存储到数组的最后一个位置
- 8、编写程序实现一个冒泡排序的算法
- 9、判断数组是否是对称的,如果是返回1,不是返回0
- 05 循环语句
一、缓冲区溢出的HelloWorld
void HelloWorld(){printf("Hello World");getchar();
}
void Fun(){int arr[5] = {1,2,3,4,5};arr[6] = (int)HelloWorld;
}
int main(int argc, char* argv[]){Fun();return 0;
}
原理:arr[5]是ebp的位置,而arr[6]是ebp+0x4的位置,即函数的返回地址,赋值给arr[6]相当于是修改了eip寄存器。
二、永不停止的HelloWorld
void Fun(){int i;int arr[5] = {0};for(i = 0; i <= 7; i++){arr[i] = 0;printf("Hello World %d\n", i); //0-6循环出现}
}
int main(int argc, char* argv[]){Fun();return 0;
}
反汇编:i等于7时,修改了rbp+0x1c-0x20即rbp-0x4位置的值,将其置为0,而该位置为i的值,所以每一轮for过后将i重新置0,就造成了不停的循环。
三、基础知识
3.1 变量的声明
- 声明一个变量就是告诉计算机,程序要用一块内存,这块内存需要保留,宽度和存储格式由数据类型决定;
- 计算机什么时候把这块内存给你,取决于变量的作用范围,如果是全局变量,在程序编译完就已经分配了空间,如果是局部变量,只有所在的程序被调用的时候,才会分配空间;
- 全局变量如果不赋初始值,默认是0,但局部变量在使用前一定要赋初值。
3.2 类型转换(一般用于小转大)
- MOVSX 先符号扩展(前面符号位是什么,就填充什么)
适用于有符号数
MOV AL,0xFF 000000FF
MOVSX CX,AL 0000FFFF
MOV AL,0x80 00000080
MOVSX CX,AL 0000FF80
- MOVZX 先零扩展
适用于无符号数
MOV AL,0xFF 000000FF
MOVZX CX,AL 000000FF
MOV AL,0x80 00000080
MOVZX CX,AL 00000080
- 类型转换举例
有符号数扩展 无符号数扩展
char i = 0xFF; unsigned char i = 0xFF;
short k = 0xFFFF; unsigned short k = 0x00FF;
int h = 0xFFFFFFFF; unsigned int h = 0x00000000FF;
- 示例代码
//有符号小转大
void Function1(){char ci = 0xFF;short si = ci;int ni = ci;
}
//无符号小转大
void Function2(){unsigned char ci = 0xFF;unsigned short si = ci;unsigned int ni = ci;
}
//有符号数大转小
//截取低位
void Function1(){int ni = 0x12345678;short si = ni;char ci = si;
}
3.3 表达式
- 表达式的特点
- 表达式无论多么复杂,都只有一个结果;
- 只有表达式,可以编译通过,但并不生成代码,需要与赋值或者其他流程控制语句一起组合的时候才有意义;
- 当表达式中存在不同宽度的变量时,将结果转换为宽度最大的那个。
char a;
int b;
a = 10;
b = 20;
printf("%d",a+b);
- 当表达式中同时存在有符号和无符号数的时候,表达式的结构将转换为无符号数
unsigned char a;
char b;
a = 0xFE;
b = 1;
printf("%d",a+b);
char b = 1;
unsigned int a = 0xFFFFFFFE;
printf("%d",a+b);//结果为-1
原因:
• char b = 1;的汇编代码是mov byte ptr [ebp-4],1
• unsigned int a = 0xFFFFFFFE;的汇编代码是mov dword ptr [ebp-8],0xFFFFFFFE
• 执行a+b的操作前,首先将b的值使用有符号扩展,movsx eax,byte ptr [ebp-4],即0x00000001
• 接着执行相加操作0xFFFFFFFE+0x00000001=0xFFFFFFFF,在计算机的底层,架构存储32位1。
• 输出时,因为使用的是“d%”,所以计算机将0xFFFFFFFF当做有符号的-1输出,反之使用“u%”时则输出无符号的0xFFFFFFFF。(计算机底层存的东西是一样的,有无符号只对人类有意义)
3.4 语句和程序块
语句对cpu或内存有影响
if-else语句是整体
3.5 参数与返回值
略
3.6 关系运算符
“==”、“!=”、“>=”、“<=”、“>”、“<”
3.7 逻辑运算符:&& || !
3.8 单目运算符
输出11-11
输出11-10
3.9 三目运算符
四、作业
1、交换两个变量值
代码:
void exchange(int x, int y){int temp;temp = x;x = y;y = temp;
}
2、将一个数组中的数倒序输出
代码:
void fun(){int arr[8] = {0,1,2,3,4,5,6,7};int n = 7;while (n>=0){printf("%d\n", arr[n]);n--;}
}int main()
{fun();return 0;
}
3、找出数组里面最大的值,并返回
代码:
int fun(){int arr[8] = {0,1,2,3,4,5,6,7};int len = 8;int i;int max = 0;for(i = 0; i < len; i++){if(max <= arr[i]){max = arr[i];}}return max;
}int main()
{printf("%d\n", fun());return 0;
}
4、将数组所有的元素相加,将结果返回
代码:
int fun(){int arr[8] = {0,1,2,3,4,5,6,7};int len = 8;int i;int num = 0;for(i = 0; i < len; i++){num += arr[i];}return num;
}
int main()
{printf("%d\n", fun());return 0;
}
5、将两个等长数组相同位置的值相加,存储到另外一个等长的数组中
代码:
int arr1[8] = {0,1,2,3,4,5,6,7};
int arr2[8] = {0,1,2,3,4,5,6,7};
int arr3[8] = {0};
void fun(){int len = 8;int i;for(i = 0; i < len; i++){arr3[i] = arr1[i] + arr2[i];}
}
6、写一个函数int prime(int x),如果x是素数返回值为1,否则返回0
代码:
int prime(int x){
int i;
for(i = 2; i < x; i++){if(x % i == 0){return 0;}
}return 1;
}
7、俩俩比较数组的值,将最大的一个存储到数组的最后一个位置
代码:
int arr[8] = {7,1,2,3,4,5,6,0};
void Max(){int g_r;for(int i = 0; i < 8-1; i++){if(arr[i] >= arr[i+1]){g_r = arr[i];arr[i] = arr[i+1];arr[i+1] = g_r;}}
}
8、编写程序实现一个冒泡排序的算法
代码:
int n[8] = {7, 6, 5, 4, 3, 2, 1, 0};
void fun(){int i, j, temp;int len = 8;for (i = 0; i <= len - 2 ; i++){for (j = 0; j <= len - 1 - i; j++){if (n[j] > n[j + 1]){temp = n[j];n[j] = n[j + 1];n[j + 1] = temp;}}}
}
9、判断数组是否是对称的,如果是返回1,不是返回0
代码:
int arr[10] = {0};
int fun(){int i, temp;int len = 10;for (i = 0; i < len/2 ; i++){if(arr[i] == arr[len-1-i]){continue;}else{return 0;}}return 1;
}
05 循环语句
相关文章:

滴水逆向三期笔记与作业——02C语言——05 正向基础/05 循环语句
目录 一、缓冲区溢出的HelloWorld二、永不停止的HelloWorld三、基础知识3.1 变量的声明3.2 类型转换(一般用于小转大)3.3 表达式3.4 语句和程序块3.5 参数与返回值3.6 关系运算符3.7 逻辑运算符:&& || !3.8 单目运算符3.9 三目运算符…...

Python抓取分享页面的源代码示例
本文章是关于利用Python方法来抓取某网站分享页面中的源码方法示例。需要大家注意的是Python抓取分享页面的源代码示例,是要在运行时导入BeautifulSoup.py文件后才可以使用。 Python抓取分享页面的源代码示例,需要用到python urllib2模块方法࿰…...

linux安装nginx遇到的报错
1、Linux如何修改只读文件(以设置自动连网为例) vim /etc/sysconfig/network-scripts/ifcfg-ens33 然后提示 E45:已设定选项“readonly”(请加!强制执行) 如果需要强制修改,可以使用࿰…...

一起学SF框架系列5.8-spring-Beans-Bean注解解析3-解析配置component-scan
本文主要讲述Spring是如何解析“context:component-scan”元素,扫描加载目录下的BeanDefinition。 解析内容 1、解析的元素如下: <!-- 注解模式:配置bean扫描路径(注:自动包含子路径) --><conte…...

【LeetCode热题100】打卡第42天:滑动窗口最大值搜索二维矩阵II
文章目录 【LeetCode热题100】打卡第42天:滑动窗口最大值&搜索二维矩阵II⛅前言 滑动窗口最大值🔒题目🔑题解 搜索二维矩阵II🔒题目🔑题解 【LeetCode热题100】打卡第42天:滑动窗口最大值&搜索二维…...

[uni-app] 微信小程序 - 组件找不到/导入报错 (分包问题导致)
文章目录 问题表现问题原因 问题表现 切换了个路径下的组件, 导入失败, 尝试了清缓存\重启\删项目等一些列操作均无效 上面两个路径中, 都存在一模一样的videItem.vue Main路径是可以导入的 Main路径是无法导入的 问题原因 后来发现, 是 分包的问题导致. 我们先来假设一个场…...

从零构建医疗领域知识图谱的KBQA问答系统:其中7类实体,约3.7万实体,21万实体关系。
项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域):汇总有意义的项目设计集合,助力新人快速实…...

编程小白的自学笔记十二(python爬虫入门四Selenium的使用实例二)
系列文章目录 编程小白的自学笔记十一(python爬虫入门三Selenium的使用实例详解) 编程小白的自学笔记十(python爬虫入门二实例代码详解) 编程小白的自学笔记九(python爬虫入门代码详解) 目录 系列文章…...

技术笔记2023076 rBoot学习7
技术笔记2023076 rBoot学习7 继续之前的学习。 代码分析:函数find_image() // prevent this function being placed inline with main // to keep mains stack size as small as possible // dont mark as static or itll be optimised out when // using the ass…...

收藏这6个抠图工具,一键抠图不用愁!
在图片编辑工作中,抠图是设计师常用的操作。随着设计工具的不断增加,抠图操作摆脱了过去繁琐的操作步骤,几乎可以一键完成。今天本文将为大家介绍6个好用的抠图工具,一起来看看吧! 1、皮卡智能抠图 皮卡智能抠图是一…...

四,Eureka 第四章
2.1.3 增加依赖 <!--添加依赖--><dependencies><!--Eureka Server--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>&l…...

k8s常见的资源对象使用
目录 一、kubernetes内置资源对象 1.1、kubernetes内置资源对象介绍 1.2、kubernetes资源对象操作命令 二、job与cronjob计划任务 2.1、job计划任务 2.2、cronjob计划任务 三、RC/RS副本控制器 3.1、RC副本控制器 3.2、RS副本控制器 3.3、RS更新pod 四、Deployment副…...

JavaScript 简单实现观察者模式和发布订阅模式
JavaScript 简单实现观察者模式和发布订阅模式 1. 观察者模式1.1 如何理解1.2 代码实现 2. 发布订阅模式2.1 如何理解2.2 代码实现 1. 观察者模式 1.1 如何理解 概念:观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时ÿ…...

高通WLAN框架学习(37)-- TDLS(Tunneled Direct Link Setup)通道直接链路建立
一 TDLS概述 隧道直连设置(TDLS)基于IEEE 802.11z-2010IEEE标准802.11z标准(无线局域网介质访问控制(MAC)和物理层(PHY)规范。 TDLS允许与同一AP关联的设备之间建立直接链路。Wi-Fi Direct允许设备之间直接连接,而不需要AP。Wi-Fi联盟认证可用于IEEE 802.11a和802.11g设备的T…...

高算力AI模组前沿应用:基于ARM架构的SoC阵列式服务器
本期我们带来高算力AI模组前沿应用,基于ARM架构的SoC阵列式服务器相关内容。澎湃算力、创新架构、异构计算,有望成为未来信息化社会的智能算力底座。 ▌性能优势AI驱动,ARM架构服务器加速渗透 一直以来,基于ARM架构的各类处理器…...

老年公寓人员定位管理系统:提升安全与关怀的智能解决方案
老年公寓作为提供安全居住环境和关怀服务的重要场所,面临着人员管理和安全控制的挑战。为了解决这些问题,老年公寓人员定位管理系统应运而生。基于为提供全面的安全管理和个性化关怀服务,华安联大便通过老年公寓人员定位管理系统的技术原理、…...

每日一题之两个字符串的删除操作
题目链接 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 **相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 示例 1: 输入: word1 "sea", word2 "eat" 输出: 2 解释: 第一步将 "sea" 变…...

nacos安装与基础配置
源码 https://github.com/alibaba/nacos https://gitee.com/mirrors/Nacos 编译 git clone https://github.com/alibaba/nacos.git cd nacos/ mvn -Prelease-nacos -Dmaven.test.skiptrue clean install -U ls -al distribution/target/// change the $version to your ac…...

GitHub Copilot:让开发编程变得像说话一样简单
引用: 人类天生就梦想、创造、创新。但今天,我们花太多时间被繁重的工作所消耗,花在消耗我们时间、创造力和精力的任务上。为了重新连接我们工作的灵魂,我们不仅需要一种更好的方式来做同样的事情,更需要一种全新的工…...

并发编程中锁的优化
在 Java 并发编程中,锁是一种常用的同步机制,用于控制对共享资源的访问。使用锁可以确保多个线程之间的互斥访问,避免数据竞争和并发问题。 然而,锁的使用可能会带来一定的性能开销,特别是在高并发场景下。 为了优化…...

笔试题:统计字符串中某字符串在其出现的字符个数
笔试题:统计字符串中某一子串的字符个数:例如字符串aabbcd,有aabb:4,ab:2 哈哈,这道题是小编面试音视频龙头企业的笔试题,以下是我写的代码:如果有错误,希望可以指正!!! 解题思路:利用双指针i和…...

Java NIO Files类读取文件流方式详解
Java NIO Files类读取文件流方式详解 Files类原理概述 java.nio.file.Files是Java标准库提供的一个工具类,用于操作文件和目录。它提供了一系列静态方法,可以用于创建、复制、删除、移动、重命名、读取、写入文件和目录等常见的文件系统操作。同时&…...

Mybatis快速入门,Mybatis的核心配置文件
Mybatis快速入门 一、Mybatis简介1.1Mybatis简化JDBC 二、Mybatis快速入门2.1创建user表,添加数据2.2创建模块,导入坐标2.3编写Mybatis核心配置文件 --> 替换连接信息,解决硬编码问题2.4编写SQL映射文件 --> 统一管理sql语句࿰…...

go语言中defer执行顺序
defer 执行顺序和调用顺序相反,类似于栈后进先出。 defer在 return 之后执行,但在函数推出之前,defer可以修改返回值。 func test() int {i : 0defer func() {fmt.Println("defer1")}()defer func() {i 1fmt.Println("defe…...

webpack xxx is not a constructor
环境 webpack5.88.2 vue-router 按需引入 原因 模块循环引用导致 有A B C三个模块 A B模块import C 中导出的class c又依赖B 中Class 的方法 B 又依赖C中的class 此时会导致import 的 C 为undefined...

安装支持vs2019的MFC(解决MSBuild 错误 MSB8041、MSB8042)
安装支持MFC的vs2019(解决MSBuild 错误 MSB8041、MSB8042) 常用安装选项解决MSBuild 错误 常用安装选项 解决MSBuild 错误 安装上述勾选内容后,即可解决MSBuild 错误 MSB8041 MSB8041:此项目需要 MFC/ATL 库。 https://learn.mic…...

校园电气安全风险分析及预防措施 安科瑞 许敏
摘要:校园属于人员密集场所,若安全风险排查、管控不到位,可能导致安全事故发生,造成严重事故后果。校园电气设备设施引起的电气火灾和触电等事故,是构成校园安全威胁之一,笔者通过对校园发生的电气安全事故案例原因分析…...

机器学习之十大经典算法
机器学习算法是计算机科学和人工智能领域的关键组成部分,它们用于从数据中学习模式并作出预测或做出决策。本文将为大家介绍十大经典机器学习算法,其中包括了线性回归、逻辑回归、支持向量机、朴素贝叶斯、决策树等算法,每种算法都在特定的领…...

系统架构设计师 11:未来信息综合技术
本章花了很多笔墨来写各项技术的发展历程,可以了解一下。 一、信息物理系统 信息物理系统(Cyber-Physical Systems,CPS)是控制系统、嵌入式系统的扩展与延伸。 CPS典型的应用场景有:健康管理、智能维护、远程征兆性…...

Docker 数据管理[文件互访] 端口映射[暴露端口提供服务] 容器互联[指定容器名防止IP变动]
Docker 的数据管理 管理 Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(DataVolumes Containers)。 1.数据卷(宿主机与容器间传输 防止删除容器后数据丢失) 数…...