05 2023 档案
摘要:C语言流 流 就每个C程序而言,所有的I/O操作只是简单从程序引进和移出字节,这种字节流叫做流,绝大多数流是完全缓冲的,这意味着读取和写入实际上是从一块称为缓冲区的内存区域来回复制数据,从内存中来回复制数据是非常快捷的,用于输出流的缓冲区只有被写满时才会被刷新到设备或文件中,把写满的缓冲区一次性输出
阅读全文
摘要:C语言static篇 变量 #include<stdio.h> void func() { int a = 0; printf("%d\t", a); static int b; printf("%d\n", b); } int main() { func(); return 0; } #inclu
阅读全文
摘要:#:预处理指令宏剥离用 ##:预处理指令宏粘合使用 先谈谈# #define str(n) n #define str(n) aanbb//无法实现 #define str(n) "aanbb"//只能输出字符串“aanbb”,无法达到预期目的 #define str(n) "aa"#n"bb"//
阅读全文
摘要:预处理器 预定义符号 由预处理器定义的符号 // 进行编译的源文件名称 __FILE__ // 文件当前行号 __LINE__ // 文件被编译的日期 __DATE__ // 文件被编译的时间 __TIME__ // 如果编译器遵循ANSI C,值为1,否则未定义 __STDC__ #define
阅读全文
摘要:高级指针 补充回顾 标量:这个名称似乎是《C和指针》的特有名词,他是为了区分数组而产生,数组可以通过下标或者数组名间接访问,可以理解为向量,而标量则与其相反,例如结构体,但是在某些博客上,则认为标量是指枚举类型、字符类型以及整数类型 指向指针的指针 int i; int *pi; int **pii
阅读全文
摘要:先检查一下开了什么保护机制 打开32位ida看看 这个是啥鸭,像这种c++的代码最难看了,只能一个函数一个函数的百度 我在这边简述一下,这些函数一大串就是实现了把s数组中的I整体替换成了you,其他的就没了,然后我们先去找找有没有后门函数之类的 找到了一个叫做get_flag的函数,打开一看,确实是
阅读全文
摘要:ciscn_2019_n_1 题目分析 这题的主要溢出点在于gets(v1),但是这题有两种思路,第一种方法是通过gets函数溢出修改变量v2的值,使v2能够通过if判断语句,执行system函数,第二种方法还是通过gets(v1)溢出,不过这次是通过libc来实现,将ebp覆盖为system函数的
阅读全文
摘要:函数调用的栈帧 每一个函数都有一块栈空间,叫做栈帧,研究函数调用栈其实就是研究主调函数与被调函数栈帧之间的问题 栈帧的作用是保存并传递被调函数的参数、被调函数的返回地址(也就是主调函数中调用完被调函数后应该执行的下一句)、被调函数的返回值、保存函数的局部变量 AMD64 CPU 提供了2个与栈相关的
阅读全文
摘要:动态内存分配复习 为什么要使用动态内存分配: 在声明数组时,必须用一个编译常量指定数组长度,但是,数组的长度往往只有在运行的时候才能被确定,这是因为它所需要的内存空间取决于输入数据,但是容易浪费空间,又或者容易溢出 malloc和free: malloc执行动态内存分配,free执行释放内存,当使用
阅读全文
摘要:1 #include<stdio.h> 2 #include<string.h> 3 #include<stddef.h> 4 #include<stdarg.h> 5 float average(int values_,...) { 6 va_list var_; 7 int i = 0; 8 f
阅读全文
摘要:关于finalshell 运行ifconfig ,观察虚拟机ens33的代码,得出计算机IP,然后选择用SSH连接。 命令行基本格式: commmand -option(选填) parameters(选填) 选项 路径(参数) 路径:第一个/表示根目录,之后的/表示层级分隔符 命令行1:ls: 显示
阅读全文
摘要:C语言结构和联合复习 定义 聚合数据类型能够同时存储一个以上的单独数据类型,C语言提供了两种类型的聚合数据类型,即数组和结构,数组存储的是相同类型元素的集合,而结构则可以是不同元素的集合,但与数组不同,结构体不能通过下标访问,这是因为数组各元素长度相同,而结构体各元素长度不等,结构体类型属于标量类型
阅读全文
摘要:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<stdarg.h>int main() { const char* a = "hello world"; char b[100] = "message"; printf("%s
阅读全文
摘要:C初级指针复习: 内存: 内存中的每一个位置都由一个独一无二的地址标识 每一个内存位置都包含一个值 值和类型: 不能简单地通过检查一个值的位来判断它的类型,为了判断值的类型(以及它的值),必须观察程序中这个值的使用方式,值的类型并非值本身所固有的一种特性,而是取决于它的使用方式 NULL指针: NU
阅读全文
摘要:程序的执行可以理解为连续的函数调用,每一个用户态(用户态指的是CPU指令集权限ring 0,用户只能访问常用CPU指令集,在应用程序中运行)进程都对应一个调用栈结构,当一个函数执行完毕后,会自动回到原先调用函数的位置(call指令)的下一步命令并执行,堆栈结构的作用是保存函数返回地址、传递函数参数、
阅读全文