c语言为编译性语言可以直接运行,而python是解释性语言需要解释器转换后才可以运行
可执行文件需要用户的权限以及文件本身的权限。
exploit :用于攻击的脚本与方案
payload :攻击载荷,是的目标进程被劫持控制流的数据(恶意数据)
shellcode :调用攻击目标的shell的代码,shell是一个提供用户与操作系统交互的命令行接口,有zsh,sh,bash
虚拟机简单操作 :
-
cd : 进入此目录
-
ls : 打开此目录,展示目录里的内容
-
file : 显示文件的属性
-
ctrl+alt+t :自动启动一个terminal 并打开一个shell
-
vim : 一个功能强大的文本编辑器。终端中输入 Vim 文件名 会打开文件并进入Vim编辑器,若文件不存在,vim会创建一个新的文件。
-
rm :用于删除文件和目录的命令。 rm 文件名 删除指定文件,删除前会进行确认;rm -f 文件名 强制删除,没有提示;
-
deepin-editor 文件名: 编辑器,输入一部分按Tab 即可自动补全
-
mv :用于移动文件或目录,也可以用来重命名文件或目录。mv 源文件(源目录) 目标目录/,将指定文件移动到目标目录中;mv 原文件名 新文件名 在同一目录里重命名文件
-
gcc 文件名:将此文件变为可执行文件
-
gcc -S 文件名: 将该文件变为汇编语言文件
-
./可执行文件:执行当前目录的可执行文件
-
~/ :家目录
-
chmod +x 文件名:给此文件添加可执行权限
-
objdump -s 文件名 :查看程序在磁盘中的结构(可执行文件)
-
cat /proc/pid/maps:查看程序在内存中的结构 (进程内存映像)
-
gdb 文件名:查看进程的内存空间信息
-
pwndbg下进行b main命令即在main函数出断点
-
pwndbg下进行vmmap命令可以查看进程的内存空间的分布
-
Linux 下的可执行文件为 ELF ,相当于Windows下的EXE文件。
Linux是按程序头来分别文件,而Windows是按后缀名来分别文件。
可执行ELF文件在磁盘中是以节(section)的形式存储,在内存中是以段(segment)的形式存储
在磁盘中(可执行ELF文件)多个具有相同作用的节转化为内存中(进程ELF影像)的一个段
Code/text段 :具有相同作用的只读不可写的节运行后转换而来。
Data 段 :存在一些可读可写的、可执行的数据。
Stack : 动态存储区,程序栈,用来管理函数调用的状态。控制函数调用控制流。
Heap : 动态存储区,给用户提供动态内存申请的调用,给用户提供动态内存分配。
32位架构中有4GB的物理内存,当执行文件时,会出现一个或多个4GB的虚拟内存,但是实际上程序所占有的空间通常很小,所以执行的程序的总空间不超过4GB的时候可以出现多个虚拟内存。而虚拟内存中3GB是用户空间,用来存放数据代码,控制用户执行的相关控制结构(例如栈);是自己的(不同的)剩余的1GB是内核空间,是共享的。Windows下是2GB给内核空间,2GB给用户空间。
64位架构中128TB是内核空间,128TB是用户空间,剩下的是未被定义的空间。
虚拟内存用户空间每个进程一份,虚拟内存内核空间所有进程共享一份。
虚拟内存mmap段中的动态链接库仅在物理内存中装在一份。
text节:实行用户所执行的功能。
plt节:解析动态链接函数的实际地址。
got.plt节:保存plt节解析出的动态链接函数的实际地址。
静态存储区:text,data,bss。存放一些在未被执行时就已经知道程序大小的数据。
Text段 存放代码,函数实现所需的机器码,一些只读数据
bss段只在内存中占用空间,不在磁盘中占用空间。存放未初始化的全局变量。
Data段存放已初始化的全局变量。
动态存储区:存放一些不知道程序大小的数据。
heap存放用户申请的内存空间
Stack:存放函数的局部变量。
32位架构:形参会存放到进程中,而所对应的实参会压栈。
64位架构:形参会传递到寄存器中。
小端序是重点
计算机最核心的本体就是cpu和内存
静态链接的程序的执行过程
fork() :复制虚拟内存的3GB,将ELF文件的3GB复制到所增添出来的3GB
execve、sys_execve :用户向操作系统申请使用硬件,可以完成fork()内容。
动态链接的程序的执行过程
id.so:管理第三方库代码的借还。