tcache中的double free
前言 第一次参加组内月赛,借这个机会正好熟悉一下glibc2.31下的tcache攻击的相关套路
难点 相比较前面,tcache增加了如下代码,检查可能的double free123456789101112131415161718192021222324252627282930313233#if USE_TCACHE { size_t tc_idx = csize2tidx (size); if (tcache != NULL && tc_idx < mp_.tcache_bins) { /* Check to see if it's already in the tcache. */ tcache_entry *e = (tcache_entry *) chunk2mem (p); /* This test succeeds on double free. However, we don't 100% trust it (it also matches random payload d ...
操作系统-设计与实现-四
前言 jyy老师太强了。这一章介绍一下并发控制中互斥相关的内容,并实现课程中的L1实验
互斥 实现共享内存上的互斥,并不是一个非常简单的事情:
系统不能同时读/写共享内存(除了原子指令),即load时不能写,只能单纯的读;而写的时候,无法进行读(即使类似于addq $1, [sum]这种指令,其也是分为读值、计算和写值三部分)。从而当一个线程完成状态读取和状态设置时,其实这两者之间可能状态已经发生了变化(另一个线程完成了状态读取和状态设置)
系统可能乱序执行指令。可能有些精妙的算法可以规避1.中的问题,例如Peterson算法。但是现代操作系统可能的指令乱序执行(即可能在读之前完成写),也会导致互斥的失败
可以看到,单纯的从软件上实现共享内存的互斥是非常困难的一件事情,因此这就往往需要硬件上进行协调配合! 硬件可以通过诸如锁总线的方式,原子的实现load-exec-store指令,从而为我们实现共享内存上的互斥提供了有效的解决方法。 这些原子指令,完美的解决了上面的两个难点,因此很容易就实现共享内存的互斥。这些方案往往简洁,且很好理解,如下面基于xchg的自选锁实现的共 ...
操作系统-设计与实现-三
前言 这一章稍微介绍一下多线程程序存在的问题,以及实现课程中的M2实验
多线程程序存在的问题 这里,我们将使用二段代码,说明多线程程序中存在的各种问题。第一段代码如下所示 12345678910111213#define n 100000000long sum = 0;void do_sum() { for (int i = 0; i < n; i++) sum++;}void print() { printf("sum = %ld\n", sum);}int main() { create(do_sum); create(do_sum); join(print);}
其中,create和join是包装pthread库的函数。 如果我们采用O0优化,即执行gcc -O0,则其输出基本一直是介于100000000到200000000的值;
如果我们采用O1优化,即执行gcc -O1,则其输出基本一直是100000000;
如果我们采用o2优化,即执行gcc -O2,则其输出 ...
操作系统-设计与实现-二
前言 这一章没有新的内容,仅仅是实现课程中的L0实验
L0直接运行在硬件上的小游戏实验背景 传统上,操作系统被认为就是”写汇编”、”跟底层打交道”。但实际上,操作系统和硬件之间的关系被夸大了。操作系统实际上不过就是一个直接运行在计算机上的(高级语言)程序而已,只是会在适当的时候调用操作系统提供的机制。 因此,在初始化完成后设置好一个没有标准库的C程序运行环境,其中包含栈区、静态数据、堆区;代码从main函数开始执行,并允许我们在程序运行过程中直接、独占式地访问操作系统中的物理设备(例如显示器、计时器)和响应中断,即可实现当下主流的操作系统
实验描述
实验要求1:实现AbstractMachine中klib中缺失的函数
AbstractMachine的项目中包含一个基础运行库的框架klib,其中包含了方便你编写bare-metal程序的系列库函数,例如assert、printf和memcpy等。尽可能实现有能力实现的代码
实验要求2:实现可移植的、直接运行在计算机硬件上的小游戏
你需要编写一个直接运行在AbstractMachine上(仅仅是用IOE拓展,不使用其他硬件机制如 ...
操作系统-设计与实现
前言 因为比较欠缺计算机基础知识,这里特别选取了南京大学蒋炎岩老师的《操作系统:设计与实现》,从而从理论和实践两方面,补全操作系统相关的知识 这些博客将简单记录重要的理论知识,以及全部的相关实验和实验心得,作为成长道路上的积累
M1打印进程树实验背景 在Linux中,everything is a file。因此操作系统的状态也可以成为文件系统的一部分——在保持文件系统基本API没有变化的基础上,添加相关对象管理操作系统的状态信息。
实验描述
实验要求:实现pstree,打印进程之间的树状的父子关系
Linux系统中可以同时运行多个程序。运行的程序称为进程。除了所有进程的根外,每个进程都只有唯一的父进程,你的任务就是将这颗树在命令行中输出。你可以自由选择展示树的方式。
总览 1pstree [OPTION]...
描述 把系统中的进程按照父亲-孩子的树状结构打印到终端
-p —show-pids:打印每个进程的进程号
-n —numeric-sort:按照pid的数值从小到大顺序输出一个进程的直接孩子
-V —version:打印版本信息
你可以在命令行中观察系统的p ...
调用汇编代码符号
前言 这里遇到了一个相关的CTF习题,看到其WP中的思路不错,特别学习一下
题目 其是picoCTF的asm4,题目要求获取调用asm4("picoCTF_a3112")的结果,其中附件代码如下所示 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758asm4: <+0>: push ebp <+1>: mov ebp,esp <+3>: push ebx <+4>: sub esp,0x10 <+7>: mov DWORD PTR [ebp-0x10],0x246 <+14>: mov DWORD PTR [ebp-0xc],0x0 <+21>: jmp 0x ...