做视频网站需要什么资质,浙江省建设工程协会网站,南昌网站建设培训班,纯静态 网站目录 课程教学一次简单的Hack程序的编译与链接Linux下的可执行文件格式ELF进程虚拟地址空间程序的编译与链接程序的装载与进程的执行x86amd64汇编简述 课程教学
课程链接#xff1a;https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source7b06bd7a9dd90c45c5c9c44d12… 目录 课程教学一次简单的Hack程序的编译与链接Linux下的可执行文件格式ELF进程虚拟地址空间程序的编译与链接程序的装载与进程的执行x86amd64汇编简述 课程教学
课程链接https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source7b06bd7a9dd90c45c5c9c44d12e7b4e6 课程附件 https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6
一次简单的Hack
Linux 二进制文件ELF
windows 二进制文件exe
比赛方在某个服务器106.54.129.202的某个端口10002挂上一个二进制服务ret2libc3比赛旨在找二进制程序中的漏洞找到后远程运行相同的程序对远程的端口发起攻击攻击成功后获得shell进而控制远程服务器进而拿到flag 执行这个二进制文件随意输入导致程序崩溃 在比赛中连接远程服务器也会获得相应的结果这里没开了所以没有结果 第一步全面了解程序 利用file 了解其格式32位linux下的可执行文件 第二步利用IDA进而分析程序 F5转汇编代码 值得注意的是这里是反编译的C语言源代码并不一定是程序编写者所编写的源代码但是功能是相同的。
第三步在C语言代码中找漏洞 在以下代码中有两个漏洞1内存泄露【红色箭头】以及2栈溢出【紫色箭头】 第四步根据漏洞编写漏洞利用程序exp.py 显然我们连接不了需要改代码 修改为本地处理 但是仍然有问题程序并没有交互而是终止了 在教程中拿到shell是可以正常交互的获得flag这个问题后续再解决 构造恶意数据发送给服务器导致程序控制流被劫持以下为payload一段字节流在网络IO里发送的总是字节流字符串对象需要编译成字节流 shell是什么
Shell是Linux/Unix的一个外壳你理解成衣服也行。它负责外界与Linux内核的交互接收用户或其他应用程序的命令然后把这些命令转化成内核能理解的语言传给内核内核是真正干活的干完之后再把结果返回用户或应用程序。
一个终端可运行多个shell提供用户与操作系统交互的命令行接口【文本接口】 平常用windows与操作系统交互用的是GUI图形化用户接口但是linux不同shell与GUI是不同的提供给用户的与操作系统交互的接口
父进程开启子进程子进程退出回到父进程
程序的编译与链接
一切编译型语言都可生成二进制程序php基于C语言很多问题都是由于C语言导致的 为什么C/C占比高其他语言及时性不高容易拥塞存在垃圾搜集器 linux不同于windows其中的文件都是借助程序头来分辨的后者是通过后缀名容易被对手欺骗例如将txt改成zip文件内容不变但是操作系统会认错 linux 可通过file来辨认即使改变后缀名也能认出来
你能操作的程序都是载入内存的在磁盘则无法交互 :%!xxd 在vim中输入将代码转成十六进制 左边是偏移量距离文件头的距离 :%!xxd -r还原 gcc test.c 编译为可执行文件a.out ./a.out执行这个文件 gcc -S test.c 编译为汇编文件test.s 仍然是文本文件还是可用gcc test.s变为可执行文件 乱码的原因是只有特定范围的值可表示为字符一字节0到25610到127对应asc码符号其他都很难看出来。 转成二进制十六进制可看到机械码CPU只认识01。
a.o不知道函数在哪a.out知道因为建立了链接【上面的步骤省略了】
Linux下的可执行文件格式ELF python也是广义上的可执行文件用ll可查看其详细信息这里是不具备执行的权限的
将其输入python3的解释器使其运行 可在文件头写入解释器再来执行 这里是权限不够即使用sudo也不行这不是用户权限不够而是文件权限不够
通过chmod x 为其添加可执行权限 段表是用于表示不同进程映像不同部分的权限的代码段不可写数据段可写 节头表是用来组织ELF文件存储在磁盘上各个节的信息 断电内存的信息就保存不了了磁盘中的文件是可保存的 程序执行不仅限于程序本体还有各种控制结构程序本体只占一小部分 objdump -s elf vmmap
进程虚拟地址空间 早期计算机在实模式下的物理内存条上运行这样容易受攻击不同程序都是在同一个物理内存甚至篡改操作系统。
保护模式地址不是物理地址操作系统给的虚拟内存地址用户无法拿到物理地址计算机硬件不可由用户直接访问存在很多隐性问题若要操纵硬件可通过系统调用接口 windows是22
CPU总线宽度一次传输的量32位/64位 glb作为未初始化的全局变量存在Bss中不占用实际的空间只有实际运行才会开辟内存占用避免浪费 str作为初始化的全局变量会先放在Data中 malloc这里动态申请100个字节的内存不用放在静态存储区所以放在Heap中只有在代码执行时才会动态分配静态是提前分配好的大小 tptr在Stack中局部变量存在栈中当一个函数执行完相关的局部变量被释放栈保存一个进程中函数的执行状态x和y作为形参参数传递使用如果是32位放在栈中如果是64位则不会放在内存而是放在寄存器速度最快所以这里没有 【重点哪部分数据存在哪个位置】
程序的编译与链接 高位和低位的放置问题 小端序 0x00002345 易于溢出 0x0000ffff 数据从低地址往高地址写 程序把从ffff到后续低地址的内存都识别为字符串从识别的位置一直溢出知道看见高位的地址是00则表示后续的都不是字符串了 【小端序直接从低地址往高地址溢出即可】 大端序 0x45230000 无法用这种方法 【大部分都是小端序的题目高位放在高内存低位放在低内存】 例如 字符串deadbeeff存在第一个内存加1存e以此类推
程序的装载与进程的执行 地址总线CPU告诉内存取哪块地址的内容 数据总线内存通过数据总线把这块内容送到CPU 控制总线传送指令 amd64向下兼容x86 一个静态链接的程序是不需要动态链接库的它所有要实现的功能和内容都写死在相应的elf文件中可独立工作 动态链接需要别人的代码先标记例如printf到时候执行再去要【操作系统的文件库】 fork拷贝一份调用函数execve【动态链接库的函数】调用系统调用sys_execve()用户态程序向操作系统申请使用硬件准备好后告知用户可以执行了执行汇编代码_start来准备程序执行的环境【这里才是真正的程序入口】 Id.so用来管理第三方库的代码借还相当于中介相对于静态动态链接需要准备的环境更多所以有__libc_start_main()以及_init
x86amd64汇编简述 栈的工作原理【后进先出读写总是在栈顶】 我们可以看间栈是从高地址到低地址但是其他的是低地址到高地址这是因为其不知道其需要多少地址空间这样Heap和Stack可以很好利用好所有的地址空间不会造成浪费或者不够用 子函数返回时子函数的栈帧被销毁 在执行sum(1,2)之前需要先保存void *ptr那一行的地址然后执行完后再把这个地址弹回去【RET的作用】 RIP不能作为被操控数