(仅用作自己学习)XMCVE 2020 CTF Pwn入门课程_哔哩哔哩_bilibili
屏幕剪辑的捕获时间: 2024/3/15 17:13
Terminal:终端
shell:区别于GUI的提供给系统的用户接口
为什么c和c++的市场占额会下不去?
很多编译型语言都存在,Gc:垃圾收集器,例如 go语言,虽然也能编译成二进制程序,但是因为gc会阻塞程序运行,不能应用在对时间精度要求很高的应用上,比如12306抢票,金融证券交易。
Linux ——》通过文件头识别文件类型
Windows ——》仅通过后缀名识别
windows上完全可以通过修改后缀名欺骗系统,但linux不行。
:%!Xxd vim进入二进制显示模式
最左侧为偏移:距离文件头的距离。
语言编译过程十分复杂,pwn中关注两个过程 汇编以及链接,尤其是链接,有动态,静态之分,在攻击时采用不同的思路。
第一层编译之后的文件中以大量的机器码储存,类似int main return0 这类的是机器系统可以直接读懂的,但是printf之类的由大神程序员写好之后集成在库或者系统中的这类,需要链接之后才能成为一个ELF可执行文件。 a.o --> a.out
汇编和机器码存在双向映射的关系
Gcc -S 编译成为汇编语言文件
./a.out 绝对路径 ~/Documents/a.out
都可以操作a这个可执行文件。
ELF文件在硬盘和内存中以不同形式存放,在执行时从硬盘进入内存时,存储时的几个同权限的section合成一段,操作系统看到的只有段,形成DATA和CODE两个段。
现代操作系统,全权接管硬件,程序员不能直接操作硬件,只能通过系统的接口调用,例如:在内存中,给进程分配的内存实际为虚拟内存,一个32位系统的4g内存条,可能其中1g是每个程序共用的系统进程的部分,分给每个进程的虚拟内存都为剩下的3g,但进程实际存储不会用完,只会在物理内存上占实际的大小。
用户空间每个进程一份,内核空间所有进程共享一份。
段视图规定进程运行时不同的权限,节视图规定了如何生成和如何存储。
系统看到节只是权限不同的节,但人看到时不同功能的模块,text节是用户定义的代码功能,plt节是系统调用动态链接函数的实际地址。
.got.plt段用于解析plt节的实际地址并存储下来,.bss段
用于存储尚未初始化的声明变量,所以不占实际内存
屏幕剪辑的捕获时间: 2024/3/16 10:47
如图。其中,由于malloc申请的空间是动态的,所以只有当执行到这条语句的时候,系统才能划出内存空间给其使用,因此不能放在静态存储区,因为静态存储区是在载入内存的时候就已经划分好的存储区域。当给ptr传入一个值的时候,就会将它放在动态存储的heap区,而局部变量通通被存放在stack中,在局部变量被丢弃的时候,对应的栈帧也会被丢弃因此放在动态区很合适。,在存储图中没出现的维二两个 x,y为形参,仅在调用时起到传递的作用,在32位系统中,会在创建sum函数的栈帧之前压栈,在64位系统中,因为寄存器空间扩展的很大,因此被放在速度最快的寄存器中,函数用到时直接在寄存器中取用。
屏幕剪辑的捕获时间: 2024/3/16 11:01
两种不同的数据存储方式,小端序相对于大端序更容易被利用 例如:
0x00在c语言中作为字符串的结尾,0x00002345,因为小端序从低位往高位写入数据,就可以利用更低位的数据溢出将2345修改为想要的数据,直到遇到00系统知道这是个字符串结束了,所以可以任意修改其低位的数据。(因为一般来说数据存不满内存地址)而在大端序中,数据从高位向低位存,则变成0x45230000,这样在溢出时直接读到一个00就结束了。
屏幕剪辑的捕获时间: 2024/3/16 11:13