栈溢出ret2text
system('bin/sh')
类型
32位基础模板
1 | from pwn import* |
- cnt:填充数据长度.
- 后门地址:有
/bin/sh
的函数地址.
64位基础模板(需要处理堆栈平衡)
堆栈平衡:当我们在堆栈中进行堆栈的操作的时候,一定要保证在 ret 这条指令之前,esp 指向的是我们压入栈中的地址,函数执行到 ret 执行之前,堆栈栈顶的地址一定要是 call 指令的下一个地址. 因此我们还需要找一个地址: lev 的地址或者该函数结束的地址(即 retn 的地址)
1 | from pwn import* |
system();
与
'bin/sh'
分开类型
32位模板
1 | cnt = 10 |
64位模板
通过ROPgadget获取rdi地址. 获取ret地址.
1
ROPgadget --binary pwn --only "pop|ret" | grep rdi
1
ROPgadget --binary pwn
1 | sh = "bin/sh"字符串的地址 |
在这个顺序下,首先会使用 rdi 指令将 sh 的地址加载到 rdi 寄存器中,然后通过 ret 指令返回到调用者,从而间接地调用了 system 函数,实现了执行系统命令的目的。
有 system();
无
'bin/sh'
类型
'bin/sh'
可用 'sh'
代替,也可以用
$0
代替. 用 'sh'
代替时,与前者相同,只是把
'bin/sh'
的地址换成了 'sh'
的地址.
使用 gdb
查看是否有可以进行写权限的数据段,如果有,就可以使用这个段里的数据单元,通过读入函数将
'/bin/sh'
写入到这个数据单元中,在以该数据单元的地址作为参数传入到 system
函数,就可以拼凑出 system(“/bin/sh”)
.
先使用gdb,在 main 函数处打断点,然后 vmmap
查看可写的数据段,同时在IDA中找到在该段内的变量,该变量的地址就是存储
/bin/sh
的地址.
32位模板
1 | from pwn import* |
64位模板
通过ROPgadget获取rdi地址. 1
ROPgadget --binary pwn --only "pop|ret" | grep rdi
1 | from pwn import* |
高级用法
1 | sendlineafter("字符串",payload) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 JasmineAura's Blog!