Vsyscall系统调用
Vsyscall系统调用前言我们知道,在开启了ASLR的系统上运行PIE程序,就意味着所有的地址都是随机化的。然而在某些版本的系统中这个结论并不成立,原因是存在着一个神奇的vsyscall。但是vsyscall仅在部分linux发行版本中可用,如Ubuntu16.04。vsyscall在内核中实现,无法用docker模拟,因此任何与vsyscall相关的实验都改成在Ubuntu 16.04进行。
Vsyscall由于一般的系统调用如果想要向内核传递一些参数的话,为了保证用户态和内核态的数据隔离,往往需要把当前寄存器状态先保存好,然后切换到内核状态,当执行完后还需要恢复寄存器的状态,而这中间就会产生大量的系统开销。因此为了解决这个问题,linux系统会将仅从内核里面读取数据的syscall单独列出来进行优化,如gettimeofday,time,getcpu。而其地址也将是固定的,原型如下:
1#define VSYSCALL_ADDR (-1UL << 20)
通过这段代码可以确定这部分是固定的,也就是ffffffffff600000。
而如果将Vsyscall的内存页d ...
PWN——GCC编译中几种保护打开和关闭的参数
PWN——GCC编译中几种保护打开和关闭的参数
NX:-z execstack / -z noexecstack (关闭 / 开启) 不让执行栈上的数据,于是JMP ESP就不能用了
Canary:-fno-stack-protector /-fstack-protector / -fstack-protector-all (关闭 / 开启 / 全开启) 栈里插入cookie信息
PIE:-no-pie / -pie (关闭 / 开启) 地址随机化,另外打开后会有get_pc_thunk
RELRO:-z norelro / -z lazy / -z now (关闭 / 部分开启 / 完全开启) 对GOT表具有写权限
Plugins-IDApro
Call To ActionThis repository is quite popular and spans all versions of IDA. If you can help categorize plugins based on version, it would be much appreciated. Submit a PR!!!
A list of IDA PluginsI’ll be organizing the plugins over time. Please submit PRs if you have any other outstanding plugins. I would like to tag each plugin with its corresponding IDA version, but it will take me a long time to test. If you can help there, please do.
If a plugin is only a source repo with no description or ...
Plugins-CTF
Awesome CTFA curated list of Capture The Flag (CTF) frameworks, libraries, resources, softwares and tutorials. This list aims to help starters as well as seasoned CTF players to find everything related to CTFs at one place.
ContributingPlease take a quick look at the contribution guidelines first.
If you know a tool that isn’t present here, feel free to open a pull request.Why?It takes time to build up collection of tools used in CTF and remember them all. This repo helps to keep all these scatt ...
Linux输入-输出(IO)-错误流and setvbuf
Linux输入-输出(I/O)-错误流and setvbuf前言因为一个文件的运行错误,导致我以为是setvbuf的问题,各种找文章了解,后来发现是一个设置的问题,太寄了,看都看差不多了,那就总结一下。
(I/O)基本概念
I/O重定向通常与FD有关,shell的FD通常为10个(FD:文件标识符—->系统为每个打开的文件指定一个文件标识符以便系统对文件进行跟踪,文件标识符是一个数字,不同数字代表不同的含义)
常用的FD有三个,为0(stdin ,标准输入),1(stdout ,标准输出)、2(stderr, 标准错误输出)
直接I/O,绕过内核缓冲
fd = open(filepath, O_WRONLY | O_DIRECT); //O_DIRECT直接IO标志
从用户空间直接将数据传递到文件或磁盘设备,把这种操作也称为直接 I/O(direct I/O)或裸 I/O(raw I/O)。
对于大多数应用程序而言,使用直接 I/O可能会大大降低性能。因为 ...
LINUX保护机制
LINUX保护机制RELRORelocation Read-Only (RELRO) 此项技术主要针对 GOT 改写的攻击方式。它分为两种,Partial RELRO 和 Full RELRO。 部分RELRO 易受到攻击,例如攻击者可以atoi.got为system.plt,进而输入/bin/sh\x00获得shell 完全RELRO 使整个 GOT 只读,从而无法被覆盖,但这样会大大增加程序的启动时间,因为程序在启动之前需要解析所有的符号。
Stack-canary栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后,函数开始执行的时候会先往栈里插入类似cookie的信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中我们将cookie信息称为canary。
NXNX enabled如果这个保护开启就是意味着 ...
Linux usr目录
Linux /usr目录前言在linux文件结构中,有个很神奇的目录/usr。
有人认为/usr是user的缩写,但是其实不是/usr是Unix Software Resource的缩写,也就是Unix操作系统软件资源所放置的目录,而不是用户数据,所有系统默认的软件都会放置到/usr,系统安装完时,这个目录会占用最多的硬盘容量。
但是说他是user的缩写也不是很过分,因为在原来usr其实是现在的HOME目录,放着各种用户文件,后来被分离出来了
目录下的重要目录
目录
应放置文件内容
/usr/X11R6/
为X Window System重要数据所放置的目录,之所以取名为X11R6是因为最后的X版本为第11版,且该版的第6次释出之意。
/usr/bin/
绝大部分的用户可使用指令都放在这里。请注意到他与/bin的不同之处。(是否与开机过程有关)
/usr/include/
c/c++等程序语言的档头(head ...
Linux proc目录
Linux /proc目录1. 什么是proc目录proc目录是linux系统下一个很重要的目录。它跟/etc、/home等这些系统目录不同,它不是一个真正的文件系统,而是一个虚拟的文件系统
它不存在于磁盘,而是存在于系统内存中。所以当你使用ls -al /proc这条命令来查看proc目录时。会看到其下面的所有文件的大小都为0字节。
proc以文件系统的方式为访问系统内核的操作提供接口。很多系统的信息,如内存的使用情况,cpu的使用情况,进程信息等等这些信息,都可以通过查看/proc的对应文件来获得。
proc文件系统是动态从系统内核读出所需信息的。
2. 初识proc目录proc目录下具体有哪些文件呢?/proc 目录下的文件/proc/cpuinifo CPU的信息(型号、家族、缓存大小等)/proc/meminfo物理内存、交换空间/proc/mounts 已加载的文件系统的列表/proc/devices 可用设备的列表/proc/file ...
Linux dev目录
Linux下的/dev目录前言在Linux下,/dev目录是很重要的,很多设备都在这个目录下
dev是设备(device)的英文缩写,/dev这个目录对于所有用户都十分重要。因为在这个目录中包含了所有Linux系统中使用的外部设备。但是这里并不是放这些外部设备的驱动程序,这一点和Windows不一样。它实际上是一个访问这些外部设备的端口。我们可以非常方便的去访问这些外部设备,和访问一个文件,一个目录没有任何区别。
dev下的设备文件设备文件分为两种:块设备文件(b)和字符设备文件(c)
设备文件一般存放在/dev目录下,对与常见设备文件作如下说明: /dev/hd[a-t]:IDE设备
/dev/sd[a-z]:SCSI设备
/dev/fd[0-7]:标准软驱
/dev/md[0-31]:软raid设备
/dev/loop[0-7]:本地回环设备
/dev/ram[0-15]:内存
/dev/ ...
GOT表和PLT表浅解
动态链接
这里引用一下大佬的比喻。如果我的文章引用了别人的一部分文字,在我发布文章的时候把别人的段落复制到我的文章里面就属于静态连接,而做一个超链接让你们自己去看就属于动态链接了
1.PLT表和GOT表GOT表:
每一个外部定义的符号在全局偏移表(Global offset Table)中有相应的条目,GOT位于ELF的数据段中,叫做GOT段。也可以叫做全局函数表。
PLT表:
过程链接表(precedure Linkage Table)也叫内部函数表。
为了程序的轻量化,出现了动态链接,动态链接是在运行时进行重定位。在编译的时候在对应需要进行引用函数的时候用plt表来代替。
由于运行时的重定位不能修改代码段,只能去修改数据段。
可执行文件里面保存的是对应plt表的地址,plt表指向对应的got表。got表保存对应的glibc的地址。
2. 延迟绑定
由于动态链接是由动态链接器在程序加载时进行的,当需要重定位的符号(库函数)多了之后,势必会影响性能。延迟绑定(lazy bingding)就是为了解决这个问题的。 ...