CTFHub Linux 动态加载
观察页面,写着没有 x权限,说明我们没有办法执行根目录下的 elf 文件 readflag,所以我们无法利用下方的 webshell 获取flag(我们的权限不够)
我们发现无法访问到 flag
Linux 下
x(eXecute,执行):对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限Linux 755权限 & 644权限:
在linux下,chomd也可以用数字表示权限 如 chomd 777 file
语法为: chomd xyz file
x: 表示 代表文件所有者拥有的权限 (User)
y:代表文件所有者同组用户的权限为 (Group)
z:代表公共用户的权限 (Other)
同时:读的权限 : r= 4 写的权限:w = 2 运行的权限为 x = 1
所以 ,755意味着:
- User rwx属性全都具备:4+2+1=7
- Group、Other 只具备 r x : 4+1=5
644 意味着失去了运行的权限
回到题目中来,页面提示我们 根目录下的 readflag 失去了 执行的权限,我们无法通过 一句话木马 获取 flag
继续思考,什么是 elf文件?
在计算机科学中,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件的文件格式。
ELF文件参与程序的连接(建立一个程序)和程序的执行(运行一个程序)
所以可以从不同的角度来看待elf格式的
- 如果用于编译和链接(可重定位文件),则编译器和链接器将把elf文件看作是节头表描述的节的集合,程序头表可选。
- 如果用于加载执行(可执行文件),则加载器则将把elf文件看作是程序头表描述的段的集合,一个段可能包含多个节,节头表可选。
这里借用一位博主的图片加深理解
elf文件左边是于编译和链接 右边是代码执行
可重定位目标文件:包含二进制代码和数据,其形式可以和其他目标文件进行合并,创建一个可执行目标文件
假如我们对执行一段程序,那么 这段代码会经历 以下阶段:
预处理阶段---->编译阶段---->汇编阶段----->代码执行
在 汇编阶段 会将我们的文件翻译成 机器语言指令,并把这些指令打包成一种叫做可重定位目标程序的格式,并将结果保存在目标文件中(把汇编语言翻译成机器语言的过程)。
汇编结束后,就要与所依赖的外部库连接起来(调用函数库)。
打个比方 我们书写了 printf(“hello world”),该程序调用了printf函数。 printf函数存在于一个名为printf.o的单独的预编译目标文件中。 链接器(ld)就负责处理把这个文件并入到hello.o程序中,结果得到hello文件,一个可执行文件。
函数库分为 静态库和动态库
静态库 指直接将我们所调用的 函数库的代码全部加入到可执行文件中,产生的文件较大,当然在使用的过程中也就不需要库文件。而动态库是指在调用的过程中,函数库以链接的形式加入到可执行文件中,让可执行文件通过链接去访问函数库,节约了系统内存。
在linux中动态库文件是ld-linux.so.2
ld-linux.so.2 glibc的库文件,一般链接到相应版本的ld-xxx.so上,是和动态库载入有关的函数
我们可以通过ldd 命令来查看一个 应用需要哪些依赖的动态库
同时在加载 动态库的时候,控制权在ld-linux.so加载器加载完所有的动态库的时候才会将权限移交给程序
而且, ELF 文件提供了相应的加载信息, GCC包含了一个特殊的 ELF 头INTERP, 这个 INTERP指定了 加载器的路径。ELF 规格要求,假如 PT_INTERP 存在的话,操作系统必须创建这个 interpreter文件的运行映射,而不是这个程序本身, 控制权会交给这个interpreter,用来定位和加载所有的动态库.
从而达到绕过 程序本身的权限不足
所以我们使用动态加载器动态链接 elf文件
使用中国蚁剑
点击右键,虚拟终端 输入我们的payload
/lib64/ld-linux-x86-64.so.2 /readflag
获得 flag