操作系统——进程
仅供个人学习参考
最大限度利用CPU 在计算机发展早期,CPU资源十分宝贵,如果一个CPU只能运行一个程序,那么当这个程序读写磁盘是,CPU就闲下来了,这在当时无异于暴殄天物,于是人们编写了一个监控程序,当某个程序暂时不使用CPU时,监控程序就把另一个在等待CPU资源的程序启动,使CPU得以充分利用,这种方法被称为多道程序(Multiprogramming),原始但是有效,但其有个问题就是程序的执行不分轻重缓急,调度策略太过于粗糙,当多个程序同时运行时,容易出现问题,有一些急需处理的程序可能要等到很久以后才能分配到CPU,比如当你当你点击鼠标,但是要等个十分钟才有响应,这是很难受的 稍作改进,让程序运行模式变成一种协作模式,即程序使用一段时间的CPU后会主动让出,这种程序协作模式叫做分时系统(Time-Sharing System),此时完整的操作系统雏形已经逐渐形成,不过这种方式也存在问题,如果此时某项程序正在进行一项耗时的计算,霸占着CPU不放,那么其他程序只能等待,整个系统看上去就好像“死机”了一样。 于是 ...
ret2csu
仅供个人学习参考
原理漏洞来源于_libc_csu_init 这个文件,它原本是用于对程序进行初始化,但是它的一些代码片段可以被我们利用如图
下面我们将0x4007d0 - 0x4007e4的片段称为gadget2,0x4007e6 - 0x4007f4的片段称为gadget1利用gadget1,我们可以实现:对rbx,rbp,r12,r13,r14,r15传参利用gadget2,我们可以实现:将r13的值赋给rdx,将r14的值赋给rsi,将r15d的值赋给edi即我们可以对rbx,rbp,r12,rdx,rsi,edi传参
注意这段汇编
12cmp rbx, rbpjnz short loc_4007D0
它的作用是比较rbx和rbp的值,如果二者不相等,就跳转到loc_4007D0这个位置,我们一般不希望它跳转,所以我们一般令rbp=1,rbx=0(因为上一句汇编是add rbx, 1 ,即使rbx的值加1)
补充:r15d和rdi都是r15的低32位部分,区别在于,r15d用于32位模式(指处理器模式而不是操作系统架构!!), ...
hexo推送文章失败解决方案
仅供个人学习参考
解决方案网上的一些常规解决方法可以先试试这边记录一下试验成功的一个方法
往本地的host文件中添加GitHub的ip格式如下
1140.82.114.4 github.com
关于如何查GitHub的ip
可以使用在线的DNS解析工具MXtoolbox (https://mxtoolbox.com/DNSLookup.aspx): MXtoolbox提供了各种网络工具,包括DNS解析工具。在其DNS Lookup页面上,你可以输入域名并选择查询类型(如A记录、CNAME记录、MX记录等),然后点击”DNS Lookup”按钮来执行DNS查询并获取IP地址。
DNS Checker (https://dnschecker.org/): DNS Checker是一个简单易用的在线DNS解析工具。你只需输入域名,选择查询类型,并点击”Go”按钮来进行DNS查询。它将显示相关的DNS记录,包括IP地址、TTL(Time To Live)值等。
DNS Lookup (https://dns-lookup.com/): DNS Lookup提供了一个简单的界面来执行D ...
格式化字符串漏洞
仅供个人学习参考
格式化字符串漏洞原理漏洞来自c语言的printf函数,因为printf函数不会检查参数的个数与格式化字符串的个数是否对应,也就是说,只要有格式化参数在,即使我们没有往printf函数传去参数,它也会默认在栈上向后(向高地址)寻找对应参数并根据格式化字符串来解析,举个栗子
1prinf("%s%s%s");
我们虽然没有给printf传参,但它依旧会把后面地址(高地址)上的内容作为参数来使用,栈的情况如下图
可以看到,格式化字符串的内容也是放在了栈上,因为我们没有传参,所以printf会把0xffffada8、0xffffada9、0xffffadaa作为参数,根据%s,将其解析并以字符串形式输出有如下语句
1printf(buf);
如果我们能控制buf的内容,就可以利用格式字符串漏洞
格式化字符串漏洞利用泄露栈内存就像上面举的例子,我们只要多写几个%s,就可将栈上的内,容解析并以字符串形式输出
1printf("%s%s%s%s%s%s%s%s%s%s%s%s%s%s")
当然,并非所有栈上的的地址都可以被解析 ...
延迟绑定机制+got表plt表
转载,原文作者: 载酒
附址:https://github.com/ctfer-zaijiu?tab=stars
仅供个人学习参考
延迟绑定机制+got表plt表
也不必说,鸣蝉在树叶里长吟,肥胖的黄蜂伏在菜花上 🌾
.plt表和.got.plt表【定义】
got表思想就是设计一个got表用来存放所有全局符号地址,早在静态链接的设计中就有,其中实现上被实现为了以下两个表:
1、.got存放全局变量引用地址
2、.got.plt存放函数引用地址
为了实现延迟绑定机制,才在got表的基础上接入了plt表,其加入有2 个设计目标:
1、实现第一次调用函数时会做重定位,而后第二次之后的所有函数调用就都是直接调用
2、实现传参并调用_dl_runtime_resolve()
这两个表被ld.so也就是动态链接器所维护,主要是:在ld.so里定义了一个_dl_runtime_resolve函数用来进行重定位+符号地址解析,并将结果更新在plt、got表中。
【结构】
plt表存储指令,got表存储指令要用到的 数据。他们都是:可复用的东西放表头,某函数独有的东西做表项。
plt表的 ...
Tips
仅供个人学习参考
flag有时候flag文件没有放在当前目录下用以下指令查找flag位置
1find -name flag
strcmpstrcmp的特性是遇到’\x00’就停止比较字符串,可以考虑0截断绕过
pwntools十六进制转十进制12python30xa //直接输入十六进制数,然后回车
十六进制转字符12python3chr(0x41) //输出为'A'
打印某函数的got表地址12elf = ELF("./filename")elf.got['function']
打包成字符串并发送1send(str(data))
p32/p64: 打包一个整数,分别打包为32位或64位u32/u64:解包一个字符串,得到整数
关于p64(p32)%s就得用p32/p64 传输数据p打包函数是将整数打包为相对应位数的地址表示方式u解包函数就是把\x\x码重新变为整数
在使用 p64 函数或者其他打包函数时,确保该函数是一个整数,而不是字节串或者其他非整数 ...
基本ROP
仅供个人学习参考
ret2text有后门就是爽
先checksec一下开启了nx保护和部分relro用ida查看文件明显有个栈溢出,且存在后门函数 基本思路:我们只需往变量s里填充垃圾数据,覆盖到ebp,再加入后门函数的地址,就可以获得shell。exp如下
123456789from pwn import *backdoor=0x0804863Apayload=b'a'*(0xffffd148-0xffffd0dc+4)+p32(backdoor)io=process("./ret2text")io.sendline(payload)io.interactive()
其中,多填充4字节的垃圾数据是为了覆盖ebp of previous stack frame,即父函数的栈帧的基指针(通常使用ebp寄存器来保存)
补充:当一个函数被调用时,它会在栈上创建一个新的栈帧,用于存储函数的局部变量、参数和其他上下文信息。在创建新栈帧时,当前函数会将其前一个栈帧的基指针值保存在 ebp 寄存器中,以便 ...
动态链接相关
仅供个人学习参考
为什么要动态链接&&动态链接基本思想 静态链接对于计算机内存和磁盘空间的浪费十分严重,且一旦程序中有任何模块更新,整个程序就需要重新链接后再发布给用户,用户每次都需要重新下载这个程序试想一下每次崩铁更新都要重新下载几十个G的文件那得多崩溃动态链接很好的优化了以上两个问题。 其基本思想如下:把程序的各个模块分割成独立的文件,等到程序要运行时再将他们链接在一起,也就是将链接过程推迟。假设我们有program1.o、program2.o和lib.o三个目标文件。program1.o用到了lib.o,即program1.o依赖于lib.o,那么系统就会加载lib.o,如果他们还依赖于其他目标文件,那操作系统就再加载用到的文件,之后再进行链接工作,之后我们如果还需运行program2,系统只需加载program2,因为内存中已经存在一份lib.o 在Linux系统中,elf动态链接文件被称为动态共享对象(DSO,Dynamic Shared Objects),简称共享对象,一般以.so为扩 ...
浅谈内存管理
仅供个人学习参考
虚拟寻址 计算机的最基本体系结构就是CPU加上内存,CPU负责计算,内存负责存储临时的计算数据,当然实际的模型要复杂得多,那么,问题来了,CPU如何准确获取内存上的数据呢? 我们先将内存假设成一个字节数组的模型
很容易可以得出一个简单粗暴的方法——物理寻址。就是照着内存的地址直接找。显然,这种寻址方式会导致许多问题,如不支持多进程同时进行(会导致不同进程之间的越级访问,互相篡改数据啥的)。所以我们现在采取另外一种寻址方式——虚拟寻址。 虚拟寻址涉及到另外一个抽象概念——虚拟地址空间。虚拟内存由虚拟地址组织起来,它使得每个进程都单独的使用整个主存(从进程的角度来看),并且每个进程所看到的内存都是一模一样的,该内存空间称为虚拟地址空间 举个栗子 如图 其中,DRAM就是我们平时所说的内存(比如某台笔记本的内存为32GB),这个内存是实实在在的物理内存,但是对于每个进程来说,他们所看到的是虚拟内存(对于32 ...