滴水逆向三期笔记与作业——02C语言——02数据类型

news2024/11/24 3:14:20

海哥牛逼

这里写自定义目录标题

  • 一、C语言如何变成汇编
    • 1、裸函数
  • 二、调用约定
    • 1、常见的几种调用约定
  • 三、程序的真正入口
  • 四、数据类型
    • 4.1 C语言中的数据类型
  • 作业

一、C语言如何变成汇编

1、裸函数

裸函数使用特殊方式定义,编译器和连接器并不会为其生成提升堆栈,开辟填充缓冲区和堆栈平衡等代码。

普通函数void Function() {}可以直接调用,并运行通过;而裸函数void __declspec(naked) Function() {}直接调用运行时不通过。

  • 这是因为前者编译器为其生成了返回的汇编代码,在函数运行结束时有ret汇编代码返回call调用前的下一跳地址;而后者没有编译器生成的返回代码,执行call时将下一跳地址入栈,但结束时没有ret指令返回,使得cpu执行到了int3或其他区域,进而报错。
无参无返回裸函数
 
void __declspec(naked) Function() {
	__asm{
		ret
	}
}
或者
void __declspec(naked) Function() {
	__asm{
		//保留调用前的栈底
		push ebp
		//提升堆栈
		mov bep,esp
		sub esp,0x40
		//保存现场
		push ebx
		push esi
		push edi
		//填充缓冲区
		lea edi,dword ptr ds:[ebp-0x40]
		mov eax,0xCCCCCCCC
		mov ecx,0x10
		rep stosd
	 
		//恢复现场
		pop edi
		pop esi
		pop ebx
		//降低堆栈
		mov esp,ebp
		//恢复栈底
		pop ebp
		 
		ret
	}
}


有参有返回裸函数(参数在函数调用前使用push入栈,局部变量在缓冲区,返回值一般在eax)
 
int __declspec(naked) Plus(int x, int y){
	__asm{
		//保留调用前的栈底
		push ebp
		//提升堆栈
		mov ebp,esp
		sub esp,0x40
		//保存现场
		push ebx
		push esi
		push edi
		//填充缓冲区
		lea edi,dword ptr ds:[ebp-0x40]
		mov eax,0xCCCCCCCC
		mov ecx,0x10
		rep stosd
		 
		//函数的核心功能:参数执行计算过程
		mov eax,dword ptr ds:[ebp+0x8]
		add eax,dword ptr ds:[ebp+0xC]
		 
		//恢复现场
		pop edi
		pop esi
		pop ebx
		//降低堆栈
		mov esp,ebp
		//恢复栈底
		pop ebp
		 
		ret
	}
}



二、调用约定

1、常见的几种调用约定

在这里插入图片描述

在这里插入图片描述

三、程序的真正入口

3.1 main 或WinMain 是“语法规定的用户入口”,而不是“应用程序入口”。应用程序入口通常是启动函数。

3.2 使用vc6的堆栈调查查看
在这里插入图片描述

mainCRTStartup 和 wmainCRTStartup 是控制台环境下多字节编码和Unicode 编码的启动函数.
而WinMainCRTStartup 和wWinMainCRTStartup 是windows 环境下多字节编码和Unicode 编码的启动函数.
3.2 修改入口函数:项目右键->Setting
在这里插入图片描述
但是并不能这样修改,因为mainCRTStartup 做了很多的初始化工作。
main函数在被调用前,首先要使用以下函数进行初始化:

在这里插入图片描述
这些函数调用结束后就会调用main 函数,根据main 函数调用的特征,将3 个参数压入栈内作为函数的参数。
编译器在调用main时,传入了三个参数

在这里插入图片描述

四、数据类型

4.1 C语言中的数据类型

在这里插入图片描述

作业

在这里插入图片描述

作业1:

int __declspec(naked) Plus(int x, int y, int z){
	__asm{
	 
		//函数调用前x,y,z已经按照从右往左的顺序入栈
		 
		//保留调用前的栈底
		push ebp
		//提升堆栈
		mov ebp,esp
		sub esp,0x40
		//保存现场
		push ebx
		push esi
		push edi
		//填充缓冲区
		lea edi,dword ptr ds:[ebp-0x40]
		mov eax,0xCCCCCCCC
		mov ecx,0x10
		rep stosd
		 
		//函数的核心功能:参数执行计算过程
		//先将局部变量2,3,4放入缓冲区
		mov dword ptr ds:[ebp-0x04],0x02
		mov dword ptr ds:[ebp-0x08],0x03
		mov dword ptr ds:[ebp-0x0C],0x04
		//进行加法运算(ebp+4是函数返回地址)
		mov eax,dword ptr ds:[ebp+0x8]  //往eax中填入z
		add eax,dword ptr ds:[ebp+0xC]  //eax=z+y
		add eax, dword ptr ds:[ebp+0x10]  //eax=z+y+x
		add eax,dword ptr ds:[ebp-0xC]   //eax=z+y+x+0x02
		add eax,dword ptr ds:[ebp-0x08]   //eax=z+y+x+0x02+0x03
		add eax,dword ptr ds:[ebp-0x04]   //eax=z+y+x+0x02+0x03+0x04
		 
		//恢复现场
		pop edi
		pop esi
		pop ebx
		//降低堆栈
		mov esp,ebp
		//恢复栈底
		pop ebp
		 
		ret
	}
}

作业2:

float12.5转换为16进制
1、整数部分:
12  --->  1100

2、小数部分:
0.5  --->  0.5*2=1  1

31100.1   --->   1.1001 * 23次方,即指数为3
 
4、转为二进制完整格式
0	10000010	10010000000000000000000
即:
0100 0001 0100 1000 0000 0000 0000 0000
4    1    4    8    0    0    0    0
41 48 00 00

作业3:
1、寻找函数入口:push了3个参数+外平栈,可以推断使用的默认的__cdecl
在这里插入图片描述

2、追寻call进入函数,找到需要逆向的区域,一共五个参数,3个内存区,2个寄存器,显然是__fastcall

在这里插入图片描述
3、画函数调用的汇编图

在这里插入图片描述
可以得出该函数核心功能为f2(f1(0x01+0x03+0x04)+f2(0x01+0x03))=0x0C
其中f1为__stdcall,f2为__cdecl

4、C语言代码是

int __cdecl F2(int x, int y){
	return x + y;
}
int __stdcall F1(int x, int y, int z){
	return x + y + z;
}
int __fastcall F(int a, int b, int c, int d, int e){
	return F2(F1(a, b, c), F2(a, b));
}
int main(int argc, char* argv[]){
	F(1, 3, 4, 6, 7);
	return 0;
}

海哥牛逼

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/489843.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为网工实验(VRRP多网关负载分担,OSPF基础操作)

采用VRRP多网关负载分担实现流量的负载均衡 配置思路:首先配置各个接口ip,让设备间能够实现通信,采用OSPF协议实现通信,然后AR2 AR3创建两个备份组,主备不同的两个备份组 组网图 #先设备命名并配置IP,三台设备类似&a…

路由器拨号密码恢复

背景 路由器拨号上网的密码因时间久远遗忘了,恢复并记录下过程。 步骤 1,安装wireshark choco install wireshark -y 注意 实践发现wireshark安装后,启动提示还需要安装Npcap 或者 Winpcap, 不过,在winpcap官网提示它已不再开…

虚拟机的克隆

第一步: 虚拟机右击 -> 管理 ->克隆 第二步: 在这一步勾选创建完整克隆,其他的都下一步 第三步 1.修改 mac地址 点击生成,就会生成一个随机的mac地址 2.修改主机名 vim /etc/hostname 修改完主机名后 reboot 重启虚拟机…

C++ STL学习之【优先级队列】

✨个人主页: 北 海 🎉所属专栏: C修行之路 🎃操作环境: Visual Studio 2019 版本 16.11.17 文章目录 🌇前言🏙️正文1、优先级队列的使用1.1、基本功能1.2、优先级模式切换1.3、相关题目 2、模拟…

蛋白质界的 ChatGPT:AlphaFold1 论文必备知识,不会有人还不知道吧

你知道 AlphaFold2 吗?它真正解决了蛋白质三维结构预测的算法困境,堪称蛋白质界的 chat-GPT4,甚至它的意义不是 chat-GPT4 所能够匹敌的。它为世界疾病治疗药物开发以及探究生物生命之谜提供了通向天神的一条道路,未来是生物的世纪…

Android开机时间工具分析

背景 android 上面有很多的方法可以分析开机时间 比如打log,通过log 分析。android 的官网上面提供了下面的两种图形化的方式来分析开机时间,一些异常很明显的拖长整个开机时间的活动 可以很容易就看出来。 问题 android 官网和网上的教程很多都不适用于…

【解决方案】基于边缘视频AIBox的校园立体防控解决方案

基于边缘AIBox的校园立体防控解决方案 一、方案背景 智慧校园安全防控系统是一款围绕学校周界安全、出入口安全、人身安全、消防安全、财产安全等校园安全场景打造的主动智能预警防控系统。它利用人工智能技术对校内及周边环境进行全天候24h实时监测和智能分析,对…

Linux最常用的15个基本命令

目录 Linux基本命令 命令1:ls (查看指定目录中有哪些内容) ls / 相当于查看根目录中的内容,相当于查看我的电脑 ls -l(小写l,或者使用ll)详细查看目录下所有内容 ls /usr/lib&#xff08…

AI面试必刷算法题 附答案和解析 --持续更新中

面试中发现很多同学一股脑优化、润色项目经历,但聊到基本的算法,反而会一脸懵X,得空整理下算法题给大家,希望对你有帮助。 1. tail(head(tail(C))) ( ) 已知广义表: A(a,b), B(A,A), C(a,(b,A),B), 求下列运算的结果:&#xff08…

vue 做一个文本展示 点击文本弹出element ui的时间选择器 但不会出现element ui时间组件的那个输入框

我们先来创建一个vue2项目 引入element ui 然后 找到一个组件 这样写 <template><div><el-date-pickerv-model"value"type"datetimerange"align"right"unlink-panelsrange-separator"至"start-placeholder"开始日…

ext-3 怎么将PDK的库包添加到CCS工程中

第一次接触ccs和A8这个库&#xff0c;PDK工具包的库是啥后缀&#xff0c;怎么添加到工程里&#xff1f;等等&#xff0c;这些摸索了好久&#xff0c;这里记录一下&#xff01;&#xff08;这里的编译器都选则的是GNU&#xff0c;非TI自带的编译器&#xff09; 目录 1、问题来…

UNIX网络编程卷一 学习笔记 第十一章 名字与地址转换

到目前为止&#xff0c;本书中所有例子都用数值地址表示主机&#xff08;如206.6.226.33&#xff09;&#xff0c;用数值端口号来标识服务器&#xff08;如端口13代表daytime服务器&#xff09;。但出于某些理由&#xff0c;我们应使用名字而非数值&#xff1a;名字比较容易记住…

编译链接再认识+gdb认识+makefile了解

索引 一. 编译链接再认识1.预处理2.编译3.汇编4.链接1.静态链接2.动态链接 二.gdb三.makefile/make 一. 编译链接再认识 主要针对gcc展开 一个文件从源文件编译成可执行文件大致要经历四个步骤 预处理&#xff08;进行宏替换&#xff09;编译&#xff08;生成汇编&#xff09…

[Pandas] 创建透视表与交叉表

1.生成透视表 在使用Python处理数据时&#xff0c;我们希望能够快速地进行排列与计算数据&#xff0c;从而帮助我们更有效的分析数据&#xff0c;pivot_table函数可以实现Excel数据透视表的功能 基本语法格式 pd.pivot_table(data, valuesNone, indexNone, columnsNone, agg…

【51单片机】使用STC烧录软件生成定时器的代码以及注意事项

&#x1f38a;专栏【51单片机】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Love Story】 &#x1f970;大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 目录 1.点击定时器计算器​编辑 2.每次打开的时…

华为MPLS跨域C1方式RR场景(数据不经过RR)实验配置

目录 配置BGP邻居的建立 配置MPLS LDP 配置RR之间的MP-BGP邻居 配置通过ASBR学习PE路由并为PE分配标签&#xff08;实现Vpnv4路由的传递和数据传输&#xff09; 根据图配置接口的IP地址和IGP协议 BGP邻居用来传递标签和RR、PE的路由 MP-BGP邻居用来传递Vpnv4路由 配置BG…

QGC分析(一)-整体分析和通信流程

参考QGroundControl开发指南 设计理念 QGC用户界面是用QML实现的。 构建 可以按照这一篇来在Windows中下载源码并且编译。QGroungControl在QT中源码编译&#xff08;包括配置环境&#xff09; 通信流程 src/comm/LinkManager.cc LinkManager始终打开UDP端口&#xff0c;…

Vue3中如何实现数字翻牌效果?

一、需求 监听数据的变化&#xff0c;实现数字翻牌效果 本人OS:本想截一个gif&#xff0c;但是一直没找到合适的截gif工具......有好用的截gif工具&#xff0c;跪求戳戳我~ 二、思路 1.设置初始数组&#xff1a;[0] 2. 把获取到的新数据整个数字用逗号隔开&#xff0c;组成…

让Bito帮你写Mokito单元测试

前言 现在稍微大一点的公司应该都有单测覆盖率要求&#xff0c;比如核心工程单测覆盖率95%以上&#xff0c;非核心工程90%以上。单测可以降低开发错误的反馈回路&#xff0c;减少重复工作&#xff0c;提升开发效率。但是写单测对于开发来说需要额外的时间。我们可以用TestMe、…

AdaBoost算法介绍和代码实现

AdaBoost算法介绍和代码实现 算法原理 AdaBoost算法的核心思想是将弱分类器组合成一个强分类器。在每一轮迭代中&#xff0c;AdaBoost会训练一个新的弱分类器并调整每个样本的权重&#xff0c;使得之前分类错误的样本在下一轮迭代中受到更多的关注。最终&#xff0c;AdaBoost…