C组第六周笔记汇总

蒋宗霈

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

许静雯

相关推荐

发表评论

路人甲

网友评论(0)