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

滴水逆向三期笔记与作业——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 变量的声明

  1. 声明一个变量就是告诉计算机,程序要用一块内存,这块内存需要保留,宽度和存储格式由数据类型决定;
  2. 计算机什么时候把这块内存给你,取决于变量的作用范围,如果是全局变量,在程序编译完就已经分配了空间,如果是局部变量,只有所在的程序被调用的时候,才会分配空间;
  3. 全局变量如果不赋初始值,默认是0,但局部变量在使用前一定要赋初值。

3.2 类型转换(一般用于小转大)

  1. MOVSX 先符号扩展(前面符号位是什么,就填充什么)

适用于有符号数

MOV AL,0xFF	000000FF
MOVSX CX,AL	0000FFFF
MOV AL,0x80	00000080
MOVSX CX,AL	0000FF80
  1. MOVZX 先零扩展

适用于无符号数

MOV AL,0xFF	000000FF
MOVZX CX,AL	000000FF
MOV AL,0x80	00000080
MOVZX CX,AL	00000080
  1. 类型转换举例

有符号数扩展 无符号数扩展

char i = 0xFF;	unsigned char i = 0xFF;
short k = 0xFFFF;	unsigned short k = 0x00FF;
int h = 0xFFFFFFFF;	unsigned int h = 0x00000000FF;
  1. 示例代码

//有符号小转大

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 表达式

  1. 表达式的特点
  • 表达式无论多么复杂,都只有一个结果;
  • 只有表达式,可以编译通过,但并不生成代码,需要与赋值或者其他流程控制语句一起组合的时候才有意义;
  • 当表达式中存在不同宽度的变量时,将结果转换为宽度最大的那个。
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],1unsigned int a = 0xFFFFFFFE;的汇编代码是mov dword ptr [ebp-8],0xFFFFFFFE
•	执行a+b的操作前,首先将b的值使用有符号扩展,movsx eax,byte ptr [ebp-4],即0x00000001
•	接着执行相加操作0xFFFFFFFE+0x00000001=0xFFFFFFFF,在计算机的底层,架构存储321。
•	输出时,因为使用的是“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 类型转换&#xff08;一般用于小转大&#xff09;3.3 表达式3.4 语句和程序块3.5 参数与返回值3.6 关系运算符3.7 逻辑运算符&#xff1a;&& || !3.8 单目运算符3.9 三目运算符…...

Python抓取分享页面的源代码示例

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

linux安装nginx遇到的报错

1、Linux如何修改只读文件&#xff08;以设置自动连网为例&#xff09; vim /etc/sysconfig/network-scripts/ifcfg-ens33 然后提示 E45&#xff1a;已设定选项“readonly”&#xff08;请加&#xff01;强制执行&#xff09; 如果需要强制修改&#xff0c;可以使用&#xff0…...

一起学SF框架系列5.8-spring-Beans-Bean注解解析3-解析配置component-scan

本文主要讲述Spring是如何解析“context:component-scan”元素&#xff0c;扫描加载目录下的BeanDefinition。 解析内容 1、解析的元素如下&#xff1a; <!-- 注解模式&#xff1a;配置bean扫描路径&#xff08;注&#xff1a;自动包含子路径&#xff09; --><conte…...

【LeetCode热题100】打卡第42天:滑动窗口最大值搜索二维矩阵II

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

[uni-app] 微信小程序 - 组件找不到/导入报错 (分包问题导致)

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

从零构建医疗领域知识图谱的KBQA问答系统:其中7类实体,约3.7万实体,21万实体关系。

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…...

编程小白的自学笔记十二(python爬虫入门四Selenium的使用实例二)

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

技术笔记2023076 rBoot学习7

技术笔记2023076 rBoot学习7 继续之前的学习。 代码分析&#xff1a;函数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个抠图工具,一键抠图不用愁!

在图片编辑工作中&#xff0c;抠图是设计师常用的操作。随着设计工具的不断增加&#xff0c;抠图操作摆脱了过去繁琐的操作步骤&#xff0c;几乎可以一键完成。今天本文将为大家介绍6个好用的抠图工具&#xff0c;一起来看看吧&#xff01; 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 如何理解 概念&#xff1a;观察者模式定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff…...

高通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模组前沿应用&#xff0c;基于ARM架构的SoC阵列式服务器相关内容。澎湃算力、创新架构、异构计算&#xff0c;有望成为未来信息化社会的智能算力底座。 ▌性能优势AI驱动&#xff0c;ARM架构服务器加速渗透 一直以来&#xff0c;基于ARM架构的各类处理器…...

老年公寓人员定位管理系统:提升安全与关怀的智能解决方案

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

每日一题之两个字符串的删除操作

题目链接 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 **相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 示例 1&#xff1a; 输入: 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:让开发编程变得像说话一样简单

引用&#xff1a; 人类天生就梦想、创造、创新。但今天&#xff0c;我们花太多时间被繁重的工作所消耗&#xff0c;花在消耗我们时间、创造力和精力的任务上。为了重新连接我们工作的灵魂&#xff0c;我们不仅需要一种更好的方式来做同样的事情&#xff0c;更需要一种全新的工…...

并发编程中锁的优化

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

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...