C语言(数据类型)

滴水逆向三期—数据类型

在这里插入图片描述
比如说这个代码,是一段C语言的代码,但是他执行的时候并不是这样的,因为CPU不认识,CPU只认识0 1二进制,所以这个代码在执行的时候一定变成了一堆0和1,变成0和1中间有两个过程,一个是编译,一个是连接
C语言函数结构:
返回值类型 函数名(参数类型,参数名,参数类型,参数名){
内容
}
如果说没有返回值内容,我们可以把返回值类型定义成void,如果有的话,就必须要有return配套,return后面需要跟一个具体的值,这个值就是得到的结果,那么这个结果就必须是前面已经规定好的类型
比如说空函数:
在这里插入图片描述
中间看到什么都没有的时候,可是还是会有很多指令,这些都是编译器,连接器替我们做的事情
那我们可以不可以让他们不替我们做事情呢?
在这里插入图片描述
这个叫做裸函数,返回值类型,什么参数都可以有但是—declspec(naked)这个必须得有,如果函数写成这样,编译器就不会去管你
在这里插入图片描述
看到这个plus我们再点一个F11
在这里插入图片描述
会发现什么都没有,所以裸函数的概念就是没人管你,为什么说裸函数呢:知道C语言怎么变成2进制的,函数里面挂钩子,各种hook,如果不想让编译器给你生成各种的东西而是自己去写的规则,所以要知道裸函数
在这里插入图片描述
一个普通的空函数,我们去调用是可以的,但是一个裸函数里面什么都没写的,我们去调用程序会报错
在这里插入图片描述
我们调用plus1的时候
在这里插入图片描述
我们在调用这个Plus1的时候是做了一个Call,这个Call做了两件事情,把0040D728压入堆栈,然后把EIP的值改了改成了Call后面的那个地址了
在这里插入图片描述
即使是空函数,在最后会有个ret回去,ret做了pop eip的事情,相当于堆栈的ESP先有一个+4的过程,要把之前ESP没+4的值放到EIP里面
当我们是裸函数的时候,我们通过call过去后F11看到的
在这里插入图片描述
发现是一堆int 3,就相当于CCCC那个,这个相当于断点,也就是程序执行到这里一定会停下来,那怎么去做可以
在这里插入图片描述
在这里插入图片描述
发现我们自己写的ret会存在了,并不是这个编译器给我们生成的了,所以我们想做任何事情没人帮你,需要我们一行一行去写
在这里插入图片描述
我们自己加了这个ret后去一行一行的执行的时候发现没有报错了

在这里插入图片描述在这里插入图片描述
我们那个1和2在堆栈里面
局部变量存在缓冲区里面,返回值存在了EAX里面
在这里插入图片描述

在这里插入图片描述在这里插入图片描述
按照我们写的去做了,40这里少加了个0X就就会出错了
在这里插入图片描述