第一步 先进去Xubuntu,打开终端。输入checksec指令,可以查看文件类型和linux下的ELF二进制文件的保护机制,本题是64位的,拖入ida
解释一下本题的保护机制
- Arch: amd64-64-little
- 表示该二进制文件是为64位的AMD或Intel架构(x86-64)编译的,并使用小端字节序。
- RELRO: Partial RELRO
- RELRO(Relocation Read-Only)是一种防止特定类型的攻击的安全技术。Partial RELRO表示部分的重定位表(GOT)被设置为只读,但并不是全部,这提供了一定级别的保护,但不如Full RELRO安全。
- Stack: No canary found
- 栈保护中的“canary”是一种防止栈溢出攻击的技术。"No canary found"意味着这种保护机制没有被启用,使得程序更容易受到栈溢出攻击。
- NX: NX disabled
- NX(No-Execute)是一种内存保护技术,用于标记某些内存区域为不可执行,防止执行非代码区域的数据。"NX disabled"表示这项保护被禁用,攻击者可能将恶意代码注入到内存中并执行。
- PIE: No PIE (0x400000)
- PIE(Position Independent Executable)允许程序的执行代码在内存中随机位置加载,增加了攻击者成功利用程序漏洞的难度。"No PIE"表示程序在每次运行时都会加载到相同的内存地址,这使得某些类型的攻击更容易实施。
- RWX: Has RWX segments
- RWX表示内存段可以同时具有读、写和执行权限。通常,为了安全,不建议将内存段设置为RWX,因为这允许攻击者写入并执行恶意代码。
总的来说,这个二进制文件的保护机制较弱,存在多个安全风险,特别是因为没有启用栈保护、NX和PIE,同时存在RWX段,使得它容易受到多种类型的攻击。
第二步 在string窗口找到/bin/sh
system("/bin/sh")在fun()函数里,不在main函数里,所以这里就有了工作: 想办法触发fun()
第三步 我们进入主函数界面
- gets函数原型只接受一个参数,即目标字符串的指针。这里的额外参数(__int64)argv是多余的,且可能导致编译错误。
- gets是一个不安全的函数,因为它不检查目标缓冲区的大小,容易造成缓冲区溢出。这是一个典型的安全漏洞。
点进去这个数组
r对应的字节数为8,及ebp的的大小;两个s之间从1到F这个距离是gets函数的范围大小,为F。(在main函数中,双击s,s占据了15个db,再加上"s"[saved registers]的8个db,一共23个db.)因为是在十六进制下,所以上面所说的gets函数覆盖范围大小为0x8+0xF。
fun()地址(View->Open subviews->Function calls 显示出函数调用窗口,如下:
)
但我们要找实际"/bin/sh"指令执行的地址为0x40118A
第四步 编写脚本
第五步 运行