购物网站建设个人总结,火山软件开发平台官网,台州平面设计公司,百度快速优化软件排名前言 最近在学二进制#xff0c;准备拿BUUCTF的pwn试试手#xff0c;还在摸索的阶段#xff0c;有什么思路出错的地方还请指出。 解题思路 下载文件到kali#xff0c;查看文件为 64-bit的ELF#xff08;ELF为Linux下的可执行文件#xff0c;相当于Windows的exe#xff0…前言 最近在学二进制准备拿BUUCTF的pwn试试手还在摸索的阶段有什么思路出错的地方还请指出。 解题思路 下载文件到kali查看文件为 64-bit的ELFELF为Linux下的可执行文件相当于Windows的exe 放入IDA中F5查看伪代码发现使用了gets函数该函数在C语言中为无限制输入可利用栈溢出return一个危险函数导致命令执行 命令执行函数就是fun()方法调用system函数可以远控服务器 fun()的地址为0x401186只要使栈溢出使return返回的是fun()的地址就能触发命令执行 栈溢出和堆溢出是两种不同的情况以下是对栈和堆的简单区分 stack栈由操作系统自动分配释放 用于存放函数的参数值、局部变量等Heap负责存储动态分配的内存空间如c语言中的malloc/free分配内存时就会分配到Heap区域 64位CPU对应寄存器 ● RSP(栈顶低地址) ● RBP(栈底高地址 ● RIP(当前栈栈帧执行的命令) 32位CPU对应寄存器 ● ESP(栈顶) ● EBP(栈底 ● EIP(当前栈栈帧执行的命令) 结合图可以看出Stack栈先进后出从高地址往低地址开辟内存空间Heap堆先进先出的特点从低地址往高地址开辟内存空间中间的shared libraries是堆和栈是共享的一片内存空间 先写出payload from pwn import *;p remote(node5.buuoj.cn,27090)
payload bC*15 bD*8 p64(0x4011861)
p.sendline(payload);
p.interactive()整个payload意图就是使用十五个字节 b’C’*15 将main函数中的char s[15]填满再需要 b’D’*8 8个字节将EBP填满这样就能导致栈溢出到指定位置再传入fun()的地址0x401186就能导致命令执行1则是为了维持堆栈平衡这个在本地是不需要的在远程服务器则需要。 至此我们就能连接远程服务器cat flag flag{ab21f884-ecef-4f2a-88fa-70d7b0b96549}