开启辅助访问 切换到窄版

打印 上一主题 下一主题

一次不用脚本的pwn解题

[复制链接]
作者:416703235 
版块:
嵌入式操作系统 linux 发布时间:2020-3-5 02:37:21
9530
楼主
跳转到指定楼层
| 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原创 紫色仰望 合天智汇
0x01:前言

我们在 ctf 中 ,更多的是在 web方向中会 使用到 linux 中的/proc 目录,这里将对它进行一次介绍与学习,并且最后再举一次pwn中 运用到它的一次实例记录.
0x02:关于proc

我们这可看下维基百科对它的介绍:
在许多类 Unix 计算机系统中, procfs 是 进程 文件系统 (file system) 的缩写,包含一个伪文件系统(启动时动态生成的文件系统),用于通过内核访问进程信息。这个文件系统通常被挂载到 /proc 目录。

由于 /proc 不是一个真正的文件系统,它也就不占用存储空间,只是占用有限的内存。
以下操作系统支持 procfs :
Linux中的 /proc实现也克隆了 九号项目 中对应的部分。
每个正在运行的进程对应于/proc下的一个目录,目录名就是进程的PID,每个目录包含:
/proc/PID/cmdline, 启动该进程的命令行.
/proc/PID/cwd, 当前工作目录的符号链接.
/proc/PID/environ 影响进程的环境变量的名字和值.
/proc/PID/exe, 最初的可执行文件的符号链接, 如果它还存在的话。
/proc/PID/fd, 一个目录,包含每个打开的文件描述符的符号链接.
/proc/PID/fdinfo, 一个目录,包含每个打开的文件描述符的位置和标记
/proc/PID/maps, 一个文本文件包含内存映射文件与块的信息。
/proc/PID/mem, 一个二进制图像(image)表示进程的虚拟内存,
只能通过ptrace化进程访问.
/proc/PID/root, 该进程所能看到的根路径的符号链接。如果没有chroot监狱,那么进程的根路径是/.
/proc/PID/status包含了进程的基本信息,包括运行状态、内存使用。
/proc/PID/task, 一个目录包含了硬链接到该进程启动的任何任务
即 /proc目录下各个文件其实就是运行程序的 PID号。我们可以使用cat 命令获取到每个进程中的相关信息。
前言中说到在web 方向中会使用到/proc/这个目录,
/proc/self 获取当前 进程 /proc/self/cwd 进程中包含的文件 /proc/self/environ 系统环境变量
而在 二进制方向的 pwn中,我也第一次遇到了 proc 的 题目,这里记录下来以及分享下为了大家更好得理解和阅读通畅,在开始之前我们 地该程序中相关一些函数和知识点 进行 学习。
0x03:程序涉及的相关知识


  • /dev/urandom
我们在linux中 获取随机数的时候,我的话目前经常见到是使用 rand函数,但其实 它是有很大的安全隐患的,即它是伪随机的,在(用srand产生)随机数种子一样的情况下,使用rand每次获得的序列都会是相同的。
其实 linux上的/dev/urandom文件产生较好的随机数(还有其相关文件/dev/random,有兴趣可以在网上搜搜索学习下)
"/dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流。很多解密程序与安全应用程序(如SSH Keys,SSL Keys等)需要它们提供的随机数据流。"
我们用open打开该文件,然后便可以从文件描述符中获取随机数据。
这里写个demo:
#include #include int main { int suiji_num; int fd=open("/dev/urandom",O_RDONLY); read(fd,&suiji_num,sizeof(int)); close(fd); printf("suiji_num is 0x%x\n",suiji_num); return 0; }
输出结果:




  • chdir
头文件:include函数原型:int chdir(const char * path);函数功能:将调用进程的当前工作目录改变为 参数path 所指的 目录
返回值:执行成功 返回 0 失败 返回 -1
写个demo:
#include #include  main { chdir("/tmp"); printf("当前目录为: %s\n", getcwd(NULL, NULL)); return 0; }
输出结果:



0x04:实例学习

我们 以 find your self 这个pwn 题 学习下 ,一个不用写脚本的 pwn。
例行检查:64位 ELF 文件,开启了canary 和 NX保护,但其实对这题 并没有什么影响。
$ file fys
fys: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6.32, BuildID[sha1]=76f8c2cb2804973c40b8c6999ecc4dca5f732786, not stripped
$ checksec fys
Arch: amd64-64-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x400000)
拖入ida,看main 函数
int __cdecl main(int argc, const char **argv, const char **envp){ char s1; // [rsp+0h] [rbp-90h] char buf; // [rsp+40h] [rbp-50h] unsigned __int64 v6; // [rsp+88h] [rbp-8h] v6 = __readfsqword(0x28u); init; memset(&buf, 0, 0x40uLL); getcwd(&buf, 0x40uLL); // 当前的工作目录绝对路径复制到参数buf 所指的内存空间 puts("where are you?"); read_n((__int64)&s1, 0x40u); // 向 s 处最多 输入 0x40 即64 的字节的字符串 if ( strcmp(&s1, &buf) ) // 需要 绕过 这个 if 判断 需要 使s1 字符串与buf字符串相同 { puts("nonono,not there"); exit(0); } read_n((__int64)&s1, 0x14u); // 覆盖 s1 ,最多输入 0x14 字节长度的 数据 if ( (unsigned int)check2(&s1) == -1 ) // 不能 s1 不能含有 *,sh,cat,..,&,|,>,< 命令符号 { puts("oh,it's not good idea"); exit(0); } close(1); // 关闭 stdout close(2); // 关闭 stderr system(&s1); return 0; // 然后 执行系统函数}
这里有个 两个 if 判断,先看第一个 我们要绕过它的话,就得使我们 输入字符串 s 等于 当前的工作目录绝对路径(在后面的分析中我们可以知道这个当前的工作目录绝对路径是通过 chdir函数 设置的 目录字符串)
第二个 if 判断 ,我们输入的字符串 s 要经过 check 2 函数处理,我们看下 分析下check2函数 即 我们 输入 s1 不能含有 *,sh,cat,..,&,|,>,< 这些符号即过滤了
sh cat * & | > &0 //把stdout 重定向 stdin 即可
在main 函数中我们看到程序首先执行了 init 函数用于初始化 工作
这里的具体分析请详见代码中的注释!
unsigned __int64 init { int buf; // [rsp+4h] [rbp-51Ch] int i; // [rsp+8h] [rbp-518h] int fd; // [rsp+Ch] [rbp-514h] int v4[52]; // [rsp+10h] [rbp-510h] char v5[1008]; // [rsp+E0h] [rbp-440h] char s; // [rsp+4D0h] [rbp-50h] char command; // [rsp+4F0h] [rbp-30h] unsigned __int64 v8; // [rsp+518h] [rbp-8h] v8 = __readfsqword(0x28u); setbuf(stdin, 0LL); setbuf(_bss_start, 0LL); fd = open("/dev/urandom", 0); buf = 0; read(fd, &buf, 1uLL); // 向 buf写入一个 随机数 buf %= 50; // 可认为是 50以内大小的 随机数 if ( fd < 0 ) exit(-1); chdir("./tmp"); // 把当前目录改为 ./tmp for ( i = 0; i &0 //把stdout 重定向 stdin
然后再 cat /flag 便成功了



这题是我在二进制方向第一次用到 /proc 这个知识点。觉得这次很详细了,可供给大家学习下。
如果想更多系统的学习CTF,可点击“http://www.hetianlab.com/pages/CTFLaboratory.jsp”,进入CTF实验室学习。

声明:笔者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天智汇及原作者无关!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表