滴水逆向三期笔记与作业——02C语言——02数据类型
海哥牛逼
这里写自定义目录标题
- 一、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,espsub esp,0x40//保存现场push ebxpush esipush edi//填充缓冲区lea edi,dword ptr ds:[ebp-0x40]mov eax,0xCCCCCCCCmov ecx,0x10rep stosd//恢复现场pop edipop esipop ebx//降低堆栈mov esp,ebp//恢复栈底pop ebpret}
}有参有返回裸函数(参数在函数调用前使用push入栈,局部变量在缓冲区,返回值一般在eax)int __declspec(naked) Plus(int x, int y){__asm{//保留调用前的栈底push ebp//提升堆栈mov ebp,espsub esp,0x40//保存现场push ebxpush esipush edi//填充缓冲区lea edi,dword ptr ds:[ebp-0x40]mov eax,0xCCCCCCCCmov ecx,0x10rep stosd//函数的核心功能:参数执行计算过程mov eax,dword ptr ds:[ebp+0x8]add eax,dword ptr ds:[ebp+0xC]//恢复现场pop edipop esipop ebx//降低堆栈mov esp,ebp//恢复栈底pop ebpret}
}
二、调用约定
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,espsub esp,0x40//保存现场push ebxpush esipush edi//填充缓冲区lea edi,dword ptr ds:[ebp-0x40]mov eax,0xCCCCCCCCmov ecx,0x10rep stosd//函数的核心功能:参数执行计算过程//先将局部变量2,3,4放入缓冲区mov dword ptr ds:[ebp-0x04],0x02mov dword ptr ds:[ebp-0x08],0x03mov dword ptr ds:[ebp-0x0C],0x04//进行加法运算(ebp+4是函数返回地址)mov eax,dword ptr ds:[ebp+0x8] //往eax中填入zadd eax,dword ptr ds:[ebp+0xC] //eax=z+yadd eax, dword ptr ds:[ebp+0x10] //eax=z+y+xadd eax,dword ptr ds:[ebp-0xC] //eax=z+y+x+0x02add eax,dword ptr ds:[ebp-0x08] //eax=z+y+x+0x02+0x03add eax,dword ptr ds:[ebp-0x04] //eax=z+y+x+0x02+0x03+0x04//恢复现场pop edipop esipop ebx//降低堆栈mov esp,ebp//恢复栈底pop ebpret}
}
作业2:
将float的12.5转换为16进制
1、整数部分:
12 ---> 11002、小数部分:
0.5 ---> 0.5*2=1 13、1100.1 ---> 1.1001 * 2的3次方,即指数为34、转为二进制完整格式
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;
}
海哥牛逼
滴水逆向三期笔记与作业——02C语言——02数据类型相关推荐
- 静态链接库,动态链接库【滴水逆向三期48笔记】
在开发过程中,我们通常会有很多函数,需要多次使用或在不同的程序中使用该函数,也有可能我们会将我们写好的函数给别人使用,但是我们又不想给他源代码,毕竟代码是我们花了很多功夫写出来的,那么我们如何不发给其 ...
- 滴水逆向三期实践1:PE头字段解析,附PE结构下载
视频资源详见网盘搜索 或 在线的B站滴水逆向三期 其课件也能在CSDN或百度搜索到,以下部分为课件内容摘要,部分为自己的理解 最后附上详细注释的自写代码 PE(Portable Executable) ...
- 导入表解析,IAT表解析【滴水逆向三期53笔记】
我们再上一章节简要介绍了IAT表,我们知道如果程序调用dll中的函数时,必须通过IAT表来找到函数,我们基本了解了IAT表之后,我们今天来讲解一下导入表,通过本章节的学习,我们可以了解导入表,也能对I ...
- IAT表入门简析【滴水逆向三期52笔记】
在讲IAT表之前,我们来回忆一下之前学习的知识: 如果我们将函数写在程序的源文件中,那么该函数就会被编译器直接编译到程序的二进制文件中,在程序调用该函数的时候,E8后跟的地址是直接写死的,程序直接在e ...
- 滴水逆向三期 win10 ASLR UnmapViewOfSection傀儡进程 加密壳项目
特意加了一个win10标题, 碰到0xc0000005的朋友就不要再浪费时间了, 我在这个问题上花了整整一天 网上全是xp的代码, 搜到了了几个win10的也是同样的错误没法解决, 唯一一个有用的答案 ...
- 滴水逆向学习笔记 -2-
目录 堆栈图(2) 相关概念 堆栈图 C语言 堆栈图(2) 相关概念 函数: 计算机中的函数是一个固定的一个程序段,或称其为一个子程序,它在可以实现固定运算功能的同时还带有一个入口和一个出口,所谓的入 ...
- 滴水逆向三期实践10:动态链接库
使用静态链接生成的可执行文件体积较大,造成浪费 我们常用的printf.memcpy.strcpy等就来自这种静态库 有维护性问题.不方便修改库中实现,修改后所有使用静态库的都要重新链接一遍 因为静态 ...
- 滴水逆向三期和中级和高期教程
联系本人QQ747554937 原版视频,海哥教学视频,不是网页上的介绍视频
- 滴水逆向学习笔记 -1-
目录 一.进制 N进制的定义 二.数据宽度_逻辑运算 数据宽度 逻辑运算 三.通用寄存器_内存读写 寄存器 内存 四.内存地址_堆栈 内存地址 堆栈 五.标志寄存器 举案例引知识 标志寄存器 相关指令 ...
最新文章
- JS中全局对象的属性和方法
- Boost.SmartPtr 的快速 (CI) 测试
- 【已解决】IDEA:Cannot start compiler:the SDK is not specified for module...
- NSOperationQueue线程队列完毕finished状态检测
- mysql 查询语句性能优化
- leetcode1085. 最小元素各数位之和 py不止是字符串的神!
- php 流(Stream)
- 小区移动基站安全吗?会杀人于无形吗?
- html基礎之渐变属性(斑马线)
- linux与windows文件共享——samba
- Python 通过打码平台实现验证码
- 为激励英特尔建厂 美国俄亥俄州拿出20亿美元优惠政策
- 2022-2028全球昼夜节律性睡眠障碍行业调研及趋势分析报告
- 彩扩机项目--两个状态指示灯,巧妙的使用二极管的特性,以及物理按键的滤波...
- 【算法】滴滴-2021校招在线笔试0913 X星文
- 使用朴素贝叶斯进行个人信用风险评估
- 用python实现成绩录入
- 图解apk的打包过程
- 数字图像处理:图像金字塔
- css 2713,CSS3 梅花花瓣