滴水逆向三期笔记与作业——02C语言——05 正向基础/05 循环语句

这篇具有很好参考价值的文章主要介绍了滴水逆向三期笔记与作业——02C语言——05 正向基础/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,就造成了不停的循环。
滴水逆向三期笔记与作业——02C语言——05 正向基础/05 循环语句,滴水逆向学习笔记,笔记,c语言,滴水逆向

三、基础知识

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 单目运算符

滴水逆向三期笔记与作业——02C语言——05 正向基础/05 循环语句,滴水逆向学习笔记,笔记,c语言,滴水逆向

输出11-11
输出11-10

3.9 三目运算符

滴水逆向三期笔记与作业——02C语言——05 正向基础/05 循环语句,滴水逆向学习笔记,笔记,c语言,滴水逆向

四、作业

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 循环语句,滴水逆向学习笔记,笔记,c语言,滴水逆向文章来源地址https://www.toymoban.com/news/detail-614321.html

到了这里,关于滴水逆向三期笔记与作业——02C语言——05 正向基础/05 循环语句的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分词算法----正向和逆向最大匹配算法(含Python代码实现)

    分词算法(Segmentation Method) 在文本处理流程中,对语句进行分词(Segmentation)操作对于计算机认识并理解人类语言是基础且重要的。 对于中文来讲,不同于英文直接采用空格符进行分隔,并且中文词语内涵丰厚,语义丰富,所以只有采用合适的分词算法,才能准确迅速地向计

    2024年03月25日
    浏览(41)
  • Blue Fox ARM逆向 读书笔记-02-Part 1_Chapter 1_Introduction to ReverseEngineering

    Blue Fox Arm Assembly Internals and Reverse Engineering读书笔记 01-Blue Fox 读书笔记-01-Introduction 02-Blue Fox 读书笔记-02-Part 1_Chapter 1_Introduction to ReverseEngineering If you’re reading this book, you’ve probably already heard about this thing called the Arm assembly language and know that understanding it is the key to analyzing bin

    2024年02月20日
    浏览(26)
  • 2023年下学期《C语言》作业0x02-分支 XTU OJ 1068 1069 1070 1071 1072

    没有换行,不然会格式错误 取模和取余的叠加使用,可以实现取数字最后一位的要求  c语言使用布尔变量需要使用stdbool.h头文件,哪怕输入的是整数,我们定义为双精度变量存储数据其实也是可以的 

    2024年02月07日
    浏览(27)
  • 城院导航小程序软件需求规范(SRS)(三期作业汇总)

    城院 导航小程序软件需求规范 (SRS) 公主请批阅! 王子请批阅! 本文档描述了城院导航小程序的功能和非功能需求。它旨在为开发团队、导师和利益相关者提供清晰、完整的需求描述。 本系统为学生、教职工和访客提供学校内部的导航服务,包括 地点 搜索、路径查询、位置

    2024年02月05日
    浏览(31)
  • 机器人——正向运动学(Forward Kinematics)与逆向运动学(Inverse Kinematics)

    正向运动学和反向运动学分别是什么意思 正向运动学是指从机器人的关节运动推导出末端执行器的运动的过程,也就是从机器人的关节坐标计算出末端执行器的位置和姿态信息的过程。反向运动学则是指从末端执行器的位置和姿态信息推导出机器人的关节坐标的过程。简单来

    2024年02月16日
    浏览(30)
  • 【go语言学习笔记】05 Go 语言实战

    在做项目开发的时候,要善于借助已经有的轮子,让自己的开发更有效率,也更容易实现。 1. RESTful API 定义 RESTful API 是一套规范,它可以规范如何对服务器上的资源进行操作。和 RESTful API 和密不可分的是 HTTP Method。 1.1 HTTP Method HTTP Method最常见的就是POST和GET,其实最早在

    2024年02月13日
    浏览(35)
  • Js逆向教程-05明确js逆向的目标

    通过本地运行js代码那 实现脱离浏览器后 能够实现和浏览器上运行加密js的效果。 网站上完全都是JavaScript实现的加密,我们的目的要知道加密的整个过程,并且 本地 实现这个加密的过程,拿到和浏览器一样的加密的结果。 得到加密的结果之后就可以跳过浏览器,本地直接

    2024年02月10日
    浏览(30)
  • MATLAB仿真UR5机器人simulink simscape 自制建模 正向运动学,逆向运动学关节空间轨迹规划 五次多项式轨迹规划

    MATLAB仿真UR5机器人simulink simscape 自制建模  正向运动学,逆向运动学 关节空间轨迹规划 五次多项式轨迹规划 笛卡尔空间轨迹规划 直线插补    还包含机器人工具箱建立的模型对比 MATLAB仿真UR5机器人simulink simscape 自制建模及运动学规划 摘要:本文介绍了利用MATLAB仿真UR5机器

    2024年02月04日
    浏览(44)
  • 2023-05-02 动态规划简介

    阶段、状态、决策、策略、状态转移方程 1) 阶段和阶段变量 将问题的全过程恰当地分成若干个相互联系的阶段 闫氏DP分析法:对应f[i][j]的ij遍历时形成的所有f[i][j] 阶段的划分一般根据时间和空间的自然特征去划分 阶段的划分便于把问题转化成 多阶段决策 问题 2) 状态和状

    2024年02月03日
    浏览(25)
  • 2023/05/02~07 刷题记录

     题义:  题解:         读完题目可以想到直接暴力,但是肯定超时别想了。         因为 a b c 都是素数,所以我们可以先求出所有的素数 进行减少循环的次数,然后遍历。在遍历过程中,我们也要去进行剪枝 ,如果说 a 的五次方大于了目标值,那后面肯定就都大于了

    2024年02月03日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包