蒋宗霈
int char[5]={1,2,3,4,5}
int *p=char
指针指向的是地址,需要一个变量
int (*p)[5]=&temp
指针数组指向的是数组的地址,需要数组的地址
指针数组和数组指针看权重
int *p[5]
int(*p)[5]
指针数组是存放地址的数组
数组指针是指向数组地址的指针
二维数组和指针
char [4] [5]
char[0] [0] [] [][ ] [] [] [] []
char[0] [0] [] [][ ] [] [] [] []
char[0] [0] [] [][ ] [] [] [] []
char[0] [0] [] [][ ] [] [] [] []
char[0] [0] [] [][ ] [] [] [] []
char是指向包含5个元素数组的指针
char 是char[0] [0]的地址
char+1是char[1] [0]的地址
*(char+1)==char[1]都是指向
一维里面 数组名如同指针变量的功能存放着第一个元素的地址
二维数组 也可类似这样看 ,形式是 array【i】存放的也是地址
void指针和null指针
void指针是通用指针,任何指针都可以赋值给void指针
赋值指针null防止出现野指针,防止奔溃
序列化与反序列化详解:
https://blog.csdn.net/tree_ifconfig/article/details/82766587
PHP反序列化原理:
未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导 致代码执行、SQL注入、目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术 方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。
php序列化与反序列化的关键函数:
serialize() 将一个对象转换成字符串
unserialize() 将字符串还原成一个对象
序列化后内容格式:object=对象
魔术方法
https://www.cnblogs.com/20175211lyz/p/11403397.html
目前的理解就是当代码运行中触发了某条件,对应的魔术方法就会被执行 对于有类的ctf题目,只需要分析代码,触发什么条件会输出什么,分析后输入相应的序列 化字符串,即可。
Java中的API实现:
位置:Java.io.ObjectOutputStream java.io.ObjectInputStream
序列化:ObjectOutputStream类—>writeObject()
注:该方法对参数指定的obj对象进行序列化,把字节序列写到哟个目标输出流中,按Java 的标准约定是给文件一个.ser扩展名 反序列化:ObjectInputStream类—>readIObject()
注:该方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
序列化和反序列化
序列化(Serialization):将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。
反序列化:从存储区中读取该数据,并将其还原为对象的过程,称为反序列化。
webgoat靶场-有java反序列化的训练环境
下方特征可以作为序列化的标志参考 一段数据以rO0AB开头,可以基本确定这就是JAVA序列化base64加密的数据,payload制 造就需要先序列化再base64加密。或者如果以aced开头,那么他就是这一段java序列化的16进制 序列化内容进行base64编码的作用:由于某些系统中只能使用ASCII字符。Base64就是用 来将非ASCII字符的数据转换成ASCII字符的一种方法。
使用Base64编码原因
1.base64是网络上最常见的用于传输8bit字节代码的编码方式之一。我们知道在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可 见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备, 由于 不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是 不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可 能性就大降低了
2.用于在http环境下传递较长的标识信息。对于反序列化的工具需要书写payload,有一款ysoserial工具可以使用,可以选择指定的选 项,利用时也要注意执行命令的payload是无法回显的,所以一般情况下需要反弹shell Java序列化后并转换格式的内容, 可以先根据格式(base64、16进制)解码得到序列化内 容,再通过serializationDumper解析数据,与ysoserial反向操作。
黑盒测试可以通过http头发现反序列化利用处。
此处没有一定的Java基础理解困难,建议学完Java再来看一次
day39-XXE&XML之利用检测绕过全解
XML被设计为数据和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可 选)、文档元素,其焦点是数据传输工具。XXE漏洞全称XML External Entity Injection, 即xml外部实体注入漏洞,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口 扫描、攻击内网网站等危害。
XML与HTML的主要差异:
- XML被设计为传输和存储数据,其焦点是数据的内容。
- HTML被设计用来显示数据,其焦点是数据的外观。
- HTML旨在显示信息,而XML旨在传输信息
对于ENTITY、SYSTEM、file等关键字被过滤,可以采用编码格式绕过UTF-16BE 详细内容可以参考:https:cnblogs.com/20175211lyz/p/11413335.html 如果http协议被过滤可以采用其他的协议方法绕过 对于使用哪种绕过可以成功执行需要进行fuzz测试,看那些成功
漏洞的发现可以采用扫描工具有专门的xxe扫描工具,也有综合的工具,还可以通过bp中抓 取的数据包信息查询关键字,Content-Type值判断又没有等于text/xml 或 application/xml的,如果没有也可以手工修改为上边两个值,将数据更改为xxe语句,看回 显,因为数据包中虽然没有写接收信息类型,但是不说明不存在
xxe安全漏洞自动化注射脚本工具XXEinjiector—使用ruby编写,需要安装环境,原理就是 payload的fuzz。
详细介绍请见
https://www.cnblogs.com/bmjoker/p/9614990.html
XXE漏洞修复:
xxe漏洞修复与防御方案-php、Java、python-过滤及禁用 方案一:禁用外部实体 比如设置PHP:libxml_disable_entity_loader(true); ,其他语言百度搜索 方案二:过滤用户提交的XML数据 过滤关键词:<!DOCTYPE和<!ENTITY或者SYSTEM和PUBLIC
阮承浩
汇编语言
汇编语言的主体是汇编指令 汇编指令是机器指令便于记忆的书写方式,是机器指令的助记符
在寄存器中,数据与程序以二进制形式存放
汇编语言的组成
1)汇编指令:(机器码的助记符,有对应的助记码)—>核心组成 ,决定特性
2)伪指令:(没有对应的助记码,由编译器执行,计算机并不执行)
3)其他符号:(由编译器识别,没有对应的机器码)例:+,-,*,/,等
存储单元
存储器被划分为若干个存储单元,每个存储单元从0开始顺序开始编号
大小转换
(上面 低地址 下面 高地址 存储器=内存,存储着指令和数据)
1KB=1024B(2的10次方)
1MB=1024KB
1GB=1024MB
1TB=1024GB
1B=8bit
磁盘的容量单位与内存相同
磁盘—->内存—->CPU 电脑CPU信息的读取步骤吧,应该
CPU对存储器的读写
1)存储单元的地址(地址信息)
2)器件的选择,读或命令(控制信息)
3)读或写的数据(数据信息)
a)计算机通过电信号传输信息,用导线来传送
b)连接CPU与其他芯片的为总线
读取过程
1)CPU通过地址线发送地址信息,表示自己想要的数据在哪
2)CPU获取地址信息,通过控制线发布内存读取命令,选中存储器芯片
3)存储器将信息通过数据线发送到CPU
4)CPU读取到自己想要的信息数据
(写入过程同前2步,第三步:CPU将写入的信息通过数据线传送到地址信息表示的地点)
CPU运行
- 运算器进行信息处理
- 寄存器进行信息存储
- 控制器控制各种器件进行工作
- 内部总线连接各种器件,在他们之间进行数据的传送
a-1)逻辑上划分为
·地址总线
·数据总线
·控制总线
(通过从不同数据线通过,可以有效来区分数据与程序之类的)
地址总线
CPU是通过地址总线来指定存储单元的
地址总线上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址
因为地址是从低往高,所以图片地址为1011
一个CPU有N根地址总线,则可以说这个CPU的地址总线的宽度为N
这样的CPU最多可以寻找2的N次方个内存单元,从零开始数,数完2的N次方即可
(一个内存单元=1Byte=8bit)
数据总线
·CPU与内存或其它器件之间的数据传送是通过数据总线来进行的
·数据总线的宽度决定了CPU和外界的数据传送速度
1)8088CPU一次传送8个字节
2)8086CPU一次传送16个字节
控制总线
·CPU对外部器件的控制是通过控制总线来进行的,且控制总线是一些不同控制线的集合
·有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制
·故控制总线的宽度决定了CPU对外部器件的控制能力
CPU可以直接使用的信息在存储器中存放
每一个CPU芯片都有许多管脚,由这些管脚引出总线
内存地址空间
主板和接口卡
- 主板:有核心器件和主要器件(CPU,存储器,外围芯片组,扩展插槽—>含有RAM内存条和各类接口卡)
- 接卡口:CPU通过总线发送命令—>接卡口,接卡口进而控制外设
8086空间分配
CPU内存分布
0~7FFFH的32KB空间为主随机存储器的地址空间
8000H~9FFFH的8KB空间为显存地址空间
A000H~FFFFH的24KB空间为各个ROM的地址空间
- 8086PC的内存地址空间为1MB(地址总线宽度2的20次方,既有2的20次方的Byte数据)
- CPU向特定内存地址里的内存单元写入数据,数据被存储进对应的存储器中
寄存器
CPU运行
- 运算器进行信息处理
- 寄存器进行信息存储
- 控制器控制各种器件进行工作
- 内部总线连接各种器件,在他们之间进行数据的传送
寄存器种类
8086CPU的14个寄存器
- AX
- BX
- CX
- DX
- SI
- DI
- SP
- BP
- SS
- IP
- CS
- DS
- ES
- PSW
且它们都是16位的,可以存在2个字节
AX BX CX DX 通用寄存器,存放一般性数据,都可以分为单独的两个8位寄存器使用,分别为高位和低位(例:AH,AL)
汇编指令举例
结果为:1044CH,但上面只能显示044CH
以内ax为16位存储器,最高位被ax舍弃,并不能被ax保存(并不是真正的舍弃)
注:汇编指令不区分大小写
字:一个字由两个字节构成,分为高位字节和低位字节
物理地址
CPU访问内存单元时要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间,唯一的地址称为物理地址
16位的CPU(小插曲)
- 运算器最多可以处理16个单位的数据
- 存储器最大宽度是16位
- 二者之间的通路为16位
地址加法器
因为8086CPU只是16的,想要得到20位的物理地址,只能将两个16位地址合成
段地址*16+偏移地址,得出物理地址
段地址*16(通常说法:二进制数据左移4位,16进制左移一位)
移位次数和数据形式的关系
二进制数据左移一位,乘以2
左移N次,乘以2的N次方
一个X型数据左移一位,相当于乘以X
16位数据左移一位,乘以16
偏移地址为16位,16位的寻址能力为64KB,所以一个段的长度最大为64KB
发表评论