csapp3
运算布尔代数中的基本运算
或 |
与 &
取反 ~
异或 ^ (相同为零,不同为一)
计算时&和|的分配律存在
例:(a&b)|c 等同于 (a|c)&(b|c)
位级运算将其他进制转换成2进制在进行运算
掩码
表达式 ~0 可以生成一个全 1 的掩码,不管机器的字大小是多少。
移位运算
左移 k 位丢掉最高的 k 位,并在右端补 k 个 0。
右移分为逻辑右移和算术右移。
逻辑右移左端补 0,算术右移左端补最高有效位的值。
一般都对有符号数使用算术右移,即补符号位的值。无符号数,只能是逻辑右移,即补 0
整数表示:无符号表示与补码表示
(java 只支持有符号数)
数据类型复数绝对值范围比正数大一(大于等于32位机器在有符号数上)
补码编码定义:最高位为符号位
[0001]=-0(x)2^3 + 0(x)2^2+ 0(x)2^1+1(x)1
C 库头文件 定义了一组常量来限定不同整数数据类型的取值范围。INT_MAX、INT_MIN、UINT_MAX
C 库头文件 中定义了 uint16_t, int32_t 等类 ...
csapp2
信息的表示与处理1.字长
对于一个字长为 a 位的机器,虚拟地址的范围是2的 a 次方~0
32位最大的虚拟内存大于是4GB 64 位可达到16EB
数据大小
为确定固定大小 int 32_t 为4字节 int 64_t 为8八字节
2.寻址与字节顺序
大端法:最高有效字节在最前面的部分
小端法:最低有效字节在最前面的部分
例:小端法表示 ox01234567
机器里面的存储为 67 45 23 01
大部分Intel 兼容机为小端模式,IBM和Oracle 的机器为大端模式
1234567891011121314151617181920212223242526272829#include<stdio.h>typedef unsigned char* byte_pointer;void show_bytes(byte_pointer start, size_t len) { size_t i; for (i = 0; i < len; i++) printf(" %.2x", start[i]); prin ...
csapp(序)
计算机系统漫游c或者c++几乎没有边界检查123456789101112typedef struct{ int a[2]; double d;}struct_t;double fun(int i){ volatile struct_t s; s.d=3.14; s.a[i]=1073741824; return s.d;}
fun(0)—– 3.14
fun(1)—– 3.14
fun(2)—– 3.1399998664856
fun(3)—– 2.00000061035156
……
运行到fun(6)程序崩溃
由于内存中数组越界相应的d内存的位置的值被数组的赋值给取代了
连续访问内存的读取速度远大于随机读取操作系统1.进程
进行一个程序的一种抽象
1)上下文
相当于计算机读取某一步骤的进行状态
2.线程
一个进程可以由多个线程组成
多线程的速率高于多进程
3.虚拟内存
进程的虚拟地址
linux操作
ls 列出
ls 可选:-a(显示所有文件) -l(详细信息显示) -d(查看目录属性)
cd 打开
cd [路径]
cd .. 上一级 cd ~ 返回home目录
mkdir 创建目录
makir [-p] (可选) [路径]
-p 自动创建不存在的父目录,用于一次性创建多层级目标
touch 创建文档
touch [路径]
touch text.txt
cat/more 打开文本
cat/more [路径]
cat 一次性打开全部,more 打开部分,可翻页依次查看全部
cp 复制
cp [-r] (可选) 类型1 类型2
-r 在复制文件夹时使用
类型1 是被复制的 类型2是要复制去的
pwd 显示当前路径mv 移动
mv 1 2
1 被移动的文件或目录 2 要移动到的文件或目录
rm 删除
rm [-r -f] (可选) [1 2 3 4 …]
-r 删除文件夹
-f 强制删除 在root权限时不提醒
通配符 ‘*’
test* 表示以test开头
‘*’test 表示以test结尾
‘*’test(t后面也有星) 表示包test的
...
第一周(栈溢出)
基本原理:
输入数值过长造成的覆盖。
基本流程:
1.在ida中打开
找到问题(在哪个函数中会发生栈溢出)
python
用gdp调试(pause)
找断点
将返回地址返回目的地址(backdoor)
拿到权限
解决:修改长度:
右键打开assembly
直接修改不能覆盖后面的代码,用mov移动
导出
不同的调用约定cdecl调用规定
函数参数按照从右到左的顺序入栈
支持调用可变参数函数
对C函数的名字修饰约定特点:函数名前加上下划线
stdcall调用约定
主调函数参数从右向左入栈
除指针或者引用类型外用数值传递的方式
C函数,stdcall名称修饰方式是在函数名字前添加下划线,在函数名字后添加@和函数参数的大小
fastcall调用约定
常使用ECX和EDX寄存器传递前两个DWORD(四字节双字)类型或更少字节的函数参数,其余参数按照从右向左的顺序入栈
返回值在EAX中
编译器使用两个@修饰函数名字,后跟十进制数表示的函数参数列表大小(字节数),如@function_name@number
thiscall调用约定naked call 调用约 ...