二进制安全学习 第一天

(仅用作自己学习)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

 

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值