中职学校网站建设情况总结企业简介画册
中职学校网站建设情况总结,企业简介画册,网站正在建设中色无夜,黄页88网在线pwn_019前置知识/proc/proc 是一个虚拟文件系统#xff0c;而是由内核在内存中动态生成#xff0c;用于暴露内核和进程的运行时信息#xff0c;每个运行中的进程在 /proc 下都有一个以 PID 命名的子目录#xff08;例如 /proc/1234/#xff09;#xff0c;当前进程可以通…pwn_019前置知识/proc/proc是一个虚拟文件系统而是由内核在内存中动态生成用于暴露内核和进程的运行时信息每个运行中的进程在/proc下都有一个以 PID 命名的子目录例如/proc/1234/当前进程可以通过/proc/self/访问自身的信息。fork()fork()是一个系统调用用于创建一个新进程子进程。当你调用fork()时操作系统会复制当前进程称为父进程的几乎一切关键是子进程从fork()返回处开始执行而不是从程序开头。它被调用一次但返回两次在父进程中fork()返回子进程的PID在子进程中fork()返回0如果出错返回-1文件描述符FD文件描述符File Descriptor简称 FD是 Linux 和 Unix 系统中用于标识打开的文件、管道、网络连接等 I/O 资源的整数。每个 Linux 进程启动时默认会打开三个文件描述符文件描述符名称对应流比喻0stdin标准输入程序的“耳朵”1stdout标准输出程序的“嘴巴”2stderr标准错误程序的“呼救”stdin (0)程序从这读取输入比如键盘输入。stdout (1)程序把正常输出写到这里显示在终端。stderr (2)程序把错误信息写到这里也显示在终端但可以与 stdout 分开重定向。在终端运行程序时这三个描述符默认都指向终端设备。文件描述符与重定向重定向的本质就是修改文件描述符表让某个描述符指向不同的文件或设备。command out.txt将标准输出fd 1重定向到文件out.txt之后command写入 fd 1 的内容都会进入文件。command 21将标准错误fd 2重定向到当前标准输出fd 1指向的地方这样错误信息也会和正常输出合并。在做题目时后当遇到fclose(stdout);这会关闭文件描述符1标准输出。fd 0 和 fd 1 实际上都指向同一个双向通道比如伪终端或 socket 连接。我们可以通过重定向将本该输出到 fd 1 的数据强行塞给 fd 0这样数据就能从输入通道传回来显示在屏幕上。exec cat /ctf* 10 # 0代表文件描述符0exec在 Linux 中exec是一系列系统调用的统称如execl、execv、execvp等。作用用一个新的程序替换当前进程的代码、数据、堆和栈。执行exec后当前进程的进程 IDPID不变但运行的内容完全变成了新程序并从新程序的main函数开始执行。如果原来的程序正在运行调用exec后原来的代码就被“覆盖”了不再执行。exec通常与fork配合使用父进程fork创建子进程子进程调用exec加载新程序这样父进程和子进程就可以运行不同的代码。题解进行IDA反汇编其中wait()暂停主进程等待子进程fclose()关闭文件输出流此时结合前置知识也就很容易明白了在if中fork()返回他的PID数必定使主进程的判断为真但是子进程中返回为0就会判断为假此时文件输出流被关闭但是可以用重定向符强制输出exec cat /ctf* 10cat /ctf* 10pwn_020前置知识动态程序是怎么找到动态链接库libc里的puts()函数的它需要查两张表PLT (Procedure Linkage Table - 过程链接表)就像一个“中转站”负责跳往 GOT 表。GOT (Global Offset Table - 全局偏移表)就像一本“电话簿”里面记录了puts()函数的真正内存地址。GOT表通常被细分为两个部分.got管变量全局静态.got.plt管函数且函数的地址是“按需”解析的。举个实际例子printf 调用流程程序执行call printf时实际跳转到.plt里的printfplt指令printfplt会去.got.plt里找printf的真实地址如果是第一次调用.got.plt里存的是 “动态链接器的地址”会先让动态链接器解析出printf的真实地址写入.got.plt后续调用printf时直接从.got.plt拿地址执行不用再解析。漏洞点如果这本“电话簿”GOT表是可写的黑客就可以把puts()的地址涂掉换成system()的地址。这样程序只要一调用puts实际上执行的就是system了。这种攻击叫GOT HijackingGOT 劫持。什么是 RELRO 保护RELRORELocation Read-Only是一种可选的二进制保护机制用于增加程序的安全性。它主要 通过限制和保护全局偏移表Global Offset Table简称 GOT和过程链接表Procedure Linkage Table简称 PLT的可写性来防止针对这些结构的攻击。它有三种等级No RELRO电话簿完全不设防你想怎么改就怎么改。.got 和 .got.plt 都是 WA (可写)。Partial RELRO部分保护电话簿的一部分如编译信息被锁死但关键的函数跳转部分 .got.plt 还是 WA (可写)。Full RELRO全保护电话簿在程序启动时就彻底焊死了。整个 GOT 表都是 R (只读)。任何修改都会导致程序崩溃。实战这个题目是一个内存写入测试器接受一个内存地址如果写入成功打印该地址现在的内容否则程序崩溃。第一步检查保护状态checkesc 检测保护checksec pwn发现 RELRO: No RELRO第二步寻找表的地址我们需要查阅 ELF 文件的“户口本”。使用readelf命令查看所有的节Sectionsreadelf -S pwn注ELF 文件的节头表Section Header Table记录了每个节如代码段、数据段、GOT表、PLT表等的名称、类型、地址、大小、权限等关键信息。节ELFExecutable and Linkable Format是 Linux 下可执行文件、目标文件.o、共享库.so的标准格式。它内部被划分为多个节每个节存储特定类型的数据。.text程序的机器代码只读。.data已初始化的全局变量可读写。.bss未初始化的全局变量运行时才分配空间。.got和.got.plt我们刚刚聊过的全局偏移表存储外部变量和函数的地址。.plt过程链接表辅助动态函数调用。.rodata只读数据如字符串常量。.symtab符号表函数名、变量名等。.strtab字符串表符号名实际存储的地方。在输出的大表中寻找以下两项寻找 .got 在输出列表中找到 .got 行。你需要记录它的 Addr比如 0000000000600f18。 看它的 Flg标志位列如果是 WA其中 W 代表 Write可写。 寻找 .got.plt 同理找到 .got.plt 的地址比如 0000000000600f28并确认其标志位是否也有 W。注Address该节在虚拟内存中的起始地址加载后flag节的属性标志W(可写)A(加载时分配内存)X(可执行)第三步利用程序行为进行验证./pwn 0x600f18得出验证可以写入师承一只枷锁