【安全学习之路】Day49

sec

Posted by Corax on November 4, 2023

C与C++的微小差异

C无法在for里面定义

集成开发环境 文本编辑器 编译器 链接器

ctrl+f7 仅编译不链接 调用cl 配置检查等级等

​ 但/p 等功能仍需要手动输入

​ /zi生活曾调试信息,/od禁止优化 –Debug核心选项

​ release优化版本 有体积优化 有速度优化

报了个error

image-20231105155833751

是默认使用预编译头文件的问题,把他勾选

image-20231105160136363

直接f7 编译加链接,省去cl+link

f9下断点

image-20231105160807170

这个时候f5就有效果了,为调试运行

image-20231105160936172

关心以文件阅读代码还是以函数来阅读代码

在调试窗口打开这个,就可以看到16进制内存

image-20231105161027537

还有stack窗口,配完差不多是这样

image-20231105161354167

watch窗口来看变量的值

f11单步步入,f10单步步过。

image-20231105163655357

第三个回上一层

因为没找到SRC文件,everything查了一下,给他用了别的.c文件,能用了

image-20231105162240801

栈窗口记录行动信息

单步之前预测内存变化,watch输入表达式,例如地址运算

比如

image-20231105170707500

或者直接在watch里面拖到hex里面

alt+8 展开汇编

地址固定的情况下一般都是0040开头,全部变量一般是0042,局部变量参数变量的地址xp 0012 2000 0014 win7 0018 win10 0019

随机地址ASLR,防的只能是远程环境,执行代码等。

本机环境,建立于内存结构理解上

依赖语言下,{}必要,因为遇到宏定义就会出错,调试不会显示。

例如putchar就有宏版和函数版,展开后就没有while依赖。

image-20231105172121464

多分支,对比switch case

image-20231105172755324

if else可以控制命中率,容易命中的放上面。

ifelse可以控制区间比较,复杂的比较条件,文件是否打开,剩余容量。

switch只做常量比较

语法原理相绑定

image-20231105173345025

命中样本一致情况下,default做优化

四种优化方案,第二种:case数据有序(而非case顺序) 数量大于三个

​ 编译器收集各个case地址,然后做成数组表,根据switch表达式结果直接转到对应元素流程运行。

如何查看这个表

下断下这里

image-20231105174651613

打开汇编,这个地址image-20231105174709656

image-20231105174730889

正好六种情况,如第一个401285

image-20231105174829763

就算case的值顺序不对,数组表的结果也会按照顺序存放。

image-20231105175015206

三种方式传递结果编译器识别 有保存功能

  1. 赋值类运算
  2. 传参
  3. 传返回值

取整

​ 上取整 ceil 正无穷方向找

​ 下取整 floor 负无穷方向

double传%d值,八位取四位,出错

循环

​ do效率比for高

goto

实际上就是跳转到NEXT后面的代码行,而非NEXT,next汇编中不展示。

合理场合:

​ 直接跳到最外层,break只能跳一层,例如异常处理

image-20231105190035157

所以看到NEXT和别的编号想减,一般就是在求代码的size。病毒传播使用广泛

完全等价

​ 自己编写仅在多重循环 异常处理使用

image-20231105191506947

for特点

image-20231105191732623

i++在循环体上面

即这样

image-20231105191816624

break continue

控制结构 循环结构

循环 线性

递归 非线性

一进一出 效率至少低一倍

image-20231105201254286

要把出口写好

image-20231105201429751

实际运行线路

image-20231105201528346

黄金分割算法 斐波那契

二叉树问题

image-20231105202341740