第一章:计算机的软硬件基本结构_3
第一章:计算机的软硬件基本结构_31.3 站得高,望得远系统软件可以分为两块,一块是平台性的,比如操作系统内核,驱动程序,运行库,和数以千计的系统工具。另一块是用于程序开发的,比如编译器,汇编器,链接器等开发工具和开发库。
计算机系统软件体系结构采用一种层的结构,有人说过一句名言:
计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决!
系统软件体系结构中,各种软件的位置如下图所示。
每个层次之间相互通过共同的通信协议来通信,我们一般将其称为 接口,接口下面那层是接口的提供者,由他定义接口;接口上面那层是借接口的使用者,它使用该接口来实现所需要的功能。
我们的软件体系中,位于最上层的应用程序,比如我们平时用到的网络浏览器,多媒体播放器,图片浏览器等。从整天层次来看,开发工具和应用程序是属于一个同一个层次的,因为他们都使用一个接口,那就是操作系统 应用程序编程接口(API)应用程序接口的提供者是运行库。
运行库使用操作系统提供的系统调用接口,系统调用接口在实现中往往以 软件中断的方式提供,比如Linux使用的0x80号中断作为系统调用接口,Windos使用0x2E号中断作为 ...
第一章:计算机的软硬件基本结构_2
第一章:计算机的软硬件基本结构1.2 万变不离其宗
计算机是个非常广泛的概念,包括大到要装数层楼的超级计算机,也有小到手上拿的手机上的嵌入式芯片都可以被称为计算机。
撇开计算机硬件中复杂的各种设备,芯片,以及外围接口的等,站在软件开发者的角度去看,我们只需要抓住硬件的几个关键部件,对于系统应用开发者来说,最为关键的部件分别是,中央处理器CPU,内存和I/O控制芯片,对于普通应用程序开发者来说,他们只需要关心CPU以外其他的都不需要,对于一些高级平台的开发者来说(如java,.NET或脚本语言开发者),连 CPU都不需要关心。因为平台为他们提供了一个通用的抽象的计算机,他们只需要关心这个抽象的计算机就可以了。
早期的计算机没有复杂的图形功能,只需要一个 总线(BUS)来连接CPU,内存和I/O设备。
后来由于CPU核心频率的提升,导致内存跟不上CPU的速度,于是产生了与内存频率一致的 系统总线,而CPU采用倍频的方式与系统总线进行通信。后面随着3D游戏和多媒体的发展,使得图形芯片需要跟CPU和内存之间大量交换数据,为了协调CPU,内存和高速的图形设备,人们专门设计 ...
符号修饰与函数签名
符号符号修饰与函数签名约在20世纪70年代以前,编译器编译源代码产生目标文件的时候,符号名与相应的变量和函数的名字是一样的。
但是现在库和目标文件越来越多,如果我们想要使用一个库的时候,我们就不能使用库中定义的函数和变量。否则就会有符号名冲突。为了防止符号名冲突,UNIX下的C语言就规定,C语言源代码文件中的所有全局变量和函数经过编译后,相对应的符号名前加上下划线”_”。
这种简单而原始的方法确实能够解决符号冲突的概率,但是当程序很大时,不同模块由多个部门开发,他们之间的命名规范如果不严格,则很有可能导致冲突。于是像C++这样的后来设计的语言开始考虑到了这个问题,增加了 名称空间(Namespace)的方法来解决多模块的符号冲突问题。
随着时间的推移,很多操作系统和编译器被完全重写,符号冲突问题不是那么明显了,现在的Linux下的GCC编译器中,默认情况下已经去掉了在C语言符号中加”_”的方式。只有GCC在windows平台下的版本(mingw,cygwin)和 Visual C++ 编译器会在C语言符号前加”_“。
C++符号修饰众所周知,强大而又复杂的C++拥有类,继承,虚机制 ...
ELF文件格式
ELF文件格式
可重定位文件,包含由编译器生成的代码和数据。链接器会将它与其他目标文件链接起来从而创建可执行文件或者目标共享文件,在linux中,这种文件后缀一般为.o
共享目标文件,包含代码和数据,这种文件是我们所称的库文件,一般是以.so结尾。
一般有两种使用情形:
链接器将其生成为另一个目标文件。
动态链接器将它与可执行文件以及其他共享目标文件组合在一起生成进程镜像。
链接视图文件开始处是ELF头部,他给出了整个文件的组织情况
如果程序头部表存在的话,他会告诉系统如何创建进程。用于生成进程的目标文件必须有程序头部表,但重定位文件不需要这个表。
节区部分包含在链接视图中要使用的大部分信息:指令,数据,符号表,重定位信息。
节区头部表包含描述文件节区的信息,每个节区在表中都有一个表项,会给出节区名称,节区大小等信息。用于链接的目标文件必须有节区头部表,其他目标文件则无所谓。
数据形式ELF文件格式支持8位/32位体系结构,当然这种格式是可以扩散的,也可以支持更小的或者更大位数的处理器架构,因此,目标文件会包含一些控制数据,这部分数据表明了目标文件所使用的架构,这也 ...
系统调用
系统调用系统调用(system calls), Linux内核, GNU C库(glibc).
在电脑中,系统调用(英语:system call),指运行在用户空间的程序向操作系统内核请求需要更高权限运行的服务。系统调用提供用户程序与操作系统之间的接口。大多数系统交互式操作需求在内核态执行。如设备IO操作或者进程间通信。
用户空间(用户态)和内核空间(内核态)操作系统的进程空间可分为用户空间和内核空间,它们需要不同的执行权限。其中系统调用运行在内核空间。
库函数系统调用和普通库函数调用非常相似,只是系统调用由操作系统内核提供,运行于内核核心态,而普通的库函数调用由函数库或用户自己提供,运行于用户态。
典型实现(Linux)Linux 在x86上的系统调用通过 int 80h 实现,用系统调用号来区分入口函数。操作系统实现系统调用的基本过程是:
应用程序调用库函数(API);
API 将系统调用号存入 EAX,然后通过中断调用使系统进入内核态;
内核中的中断处理函数根据系统调用号,调用对应的内核函数(系统调用);
系统调用完成相应功能,将返回值存入 EAX,返回到中断处理函数;
中断处 ...
由endbr64指令而获取到的CET知识
由endbr64指令而获取到的CET知识控制流完整性针对于漏洞利用,最终的效果和目的就是劫持控制流,控制目标程序做一些他本来做不了的事情。可以达到这一目的的方式有很多,比如ROP、劫持函数指针等等。而这些都来自于软件中一些漏洞,如缓冲区溢出、释放后利用等等。最初防御的方式就是头疼医头,脚疼医脚,哪里出现了漏洞比如缓冲区溢出,我们就检查一下内存边界,或者在边界处设置一个cookie(canary)。
或许是漏洞多的补不过来,之前的防御方式不能很好的完成防御计算机被破坏的工作,原本的防御方式经过几轮较量后衍生出了很多绕过方式,这些攻击手法就是现代漏洞利用技术的核心,比如ROP。如果攻击者通过层层阻挠,到达了执行ROP这一步,那么后续的路基本就畅通无阻了,因为之前并没有防御ROP的有效方式。
CFI即Control Flow Integrity控制流完整性就是指程序运行时控制流的合法性。这一步概念被提出来主要就是为了针对ROP的防御。可以将程序运行看作是一辆车在路上跑,开发者遵循的安全开发准则,比如说严格控制好边界等可以看作是司机在路上遵守交通规则;而之前的防御如canary等内存边界检查机 ...
汇编语言——王爽版总结
汇编语言——王爽版总结基础知识
汇编语言包括汇编指令和伪指令还有其他符号
在内存或磁盘上,指令和数据没有任何区别,都是二进制
CPU对存储器的读写是通过总线
总线从逻辑上又分为地址总线和控制总线还有数据总线
对于CPU来说,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制。这个逻辑存储器即是我们所说的内存地址空间。
寄存器
寄存器分为通用寄存器和段寄存器还有其他的寄存器
AX,BX,CX,DX都是通用寄存器,还可以细分为AH和AL其他寄存器同样,AL和AH等寄存器可以看做独立的寄存器。
一个字节为8bit,一个字节两个字。
由于8086寄存器是16位,但是地址总线为20位,可以达到1m的寻址能力。故
CPU中相关的部件提供两个16位的地址,一个为段地址,一个为偏移地址,物理地址为段地址*16+偏移地址。
段地址存放在段寄存器中,段寄存器根据不同的段又分为CS,DS,SS,ES段寄存器。
CS和IP是8086的两个关键的寄存器,他们指示了CPU当前要读取指令的地址。CS为段寄存器,IP为指令指针寄存器(也可以叫做指令偏移寄存器,我这么认 ...
寄存器和汇编指令基础和对于栈区的思考
寄存器和汇编指令基础0X1寄存器
通用寄存器
AX,BX,CX,DX
AX是累积寄存器,相对于其他寄存器,在运算方面比较常用,是很多加法乘法指令的缺省寄存器。
BX是基地暂存器,作为内存偏移指针使用,在内存寻址时存放基地址。
CX是计数暂存器,是重复(REP)前缀指令和LOOP指令的内定寄存器。
DX是资料暂存器,用来放整数除法产生的余数。
IP,SP,BP,
IP是存储CPU下次所执行的指令地址(存放指令偏移地址)。
SP是指针的寄存器,用于堆栈操作。被形象地称为栈顶指针。
BP是基址指针,一般指向当前栈帧的栈底地址。
他经常被称为高级语言函数调用的“框架指针”,在逆向的时候,经常可以看见一个标准的函数起始代码:
123push ebp ;保存当前ebpmov ebp,esp;EBP设为当前栈帧的栈底指针sub esp , n ;预留n个字节给函数临时变量
SI,DI
SI和DI是变址寄存器。
SI是源变址寄存器,在内存操作指令中作为“源地址指针”使用。
DI是目的变址寄存器,在内存操作指令中作为“目的地址”使用。
R8~R15
内容不详,暂时还用不到这些知识,才疏学浅, ...
学习资源
学习资源 ¶在线学习 ¶
i 春秋 - 专业的网络安全 | 信息安全在线学习培训平台
看雪知识库
CTFHub
学习路线 ¶
知道创宇研发技能表 v3.1
漏洞银行 (BUGBANK) 技能树
安全技能树简版 by 余弦
安全类思维导图 by phith0n
信息安全从业者书单推荐
CTFHub 技能树
信息资讯 ¶
FreeBuf.COM | 关注黑客与极客
安全客 - 有思想的安全新媒体
嘶吼 RoarTalk – 回归最本质的信息安全
Sec-News 安全文摘
技术论坛 ¶
吾爱破解
看雪论坛
先知社区
i 春秋论坛
CTF 赛事 ¶
XCTF 社区
CTFtime
CTFHub 赛事中心
CTF OJ¶
XCTF OJ
CTF 大本营
pwnhub
南邮网络攻防训练平台
HackingLab 网络信息安全攻防学习平台
BugkuCTF
WeChall
Sniper OJ
Jarvis OJ
CTF Learn
Hackme CTF
Practice CTF List
CTFHub 真题复现
CTF 工具 ¶
看雪工具
吾爱破解工具
CTF 在线工具 by CTFc ...
Windows PE 文件头解析
Windows PE 文件头解析0x01 PE文件基本介绍PE文件的全称是Portable Executable,意为可移植的可执行的文件,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(来自百度百科)。包括DOS头、PE头、节表、导入表和导出表。
本文主要介绍DOS头、NT头、标准PE头、可选PE头和节表。
在介绍前先了解几个概念:
虚拟地址(Virtual Address,VA):在windows系统中,PE文件被系统加载器映射到内存中。每个程序都有自己的虚拟空间,这个虚拟空间的内存地址称为虚拟地址。
相对虚拟地址(Relative Virtual Address,RVA):RVA是PE文件被装在到内存中,某个数据位置相对于装入地址的偏移量。假设一个程序从400000h处装入,代码开始与401000h,于是RVA = 401000h - 400000h,为1000h
虚拟地址(RV)= 基地址(ImageBase)+ 相对虚拟地址(RVA)
有关ImageBase的内容后面会介绍到。
下图为PE文件 ...