第一步 checksec,并检查该题的保护机制
该题的保护机制如下:
- Arch (架构): amd64-64-little
- 这意味着这个二进制文件是为64位AMD64架构编译的,使用小端序(little-endian)。
- RELRO (重定位-read-only): Partial RELRO
- Partial RELRO意味着这个二进制文件只部分地采用了RELRO保护。在程序启动时,一些符号重定位信息仍然可以被修改,但全局偏移表(GOT)是部分写保护的。这比完全没有RELRO保护要安全一些,但仍然不如完全RELRO保护。
- Stack (栈): No canary found
- 栈保护机制通常包括栈保护符(canary),这是一个随机生成的值,用于检测栈溢出。这里显示“没有找到canary”,意味着这个二进制文件没有使用栈保护,这使得它更容易受到栈溢出攻击。
- NX (No-eXecute): NX enabled
- NX位被启用,这意味着栈上的数据不能被执行。这是一种防止缓冲区溢出攻击的有效方法,因为它阻止了攻击者将恶意代码注入到栈上并执行它。
- PIE (Position-Independent Executable): No PIE (0x400000)
- PIE是一种安全特性,可以使程序的内存地址空间在每次运行时都不同,从而增加攻击者利用内存漏洞的难度。这里显示“没有PIE”,并且给出了一个固定的加载地址(0x400000),这意味着这个二进制文件没有使用PIE,这会使得它更容易受到某些类型的攻击,比如返回导向编程(ROP)攻击。
第二步 进入主函数,发现func,main函数调用了func,func中存在经典gets()漏洞,我们看到本题是v2数组在做比较
跟进v2
得到gets缓冲区的范围大小。用垃圾数据填充v1(如上图箭头为0x30+0x8),溢出v2,覆盖到下方的system函数,转换到cat/flag的地址0x4006BE
第三步 编写脚本
第四步 运行