IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> buu-[QCTF2018]Xman-babymips -> 正文阅读

[C++知识库]buu-[QCTF2018]Xman-babymips

32位elf文件,MIPS指令集
在这里插入图片描述
gayhub上下载有关ida的插件
根据ida-master/plugins的readme文件安装插件
在这里插入图片描述

在这里插入图片描述

有了插件但是不会用,原地载了一个7.5版本的ida(7.5版本支持mips的伪代码)(吾爱破解上有

查看主函数

int __fastcall main(int a1, char **a2, char **a3)
{
  int result; // $v0
  int i; // [sp+18h] [+18h] BYREF
  char v5[36]; // [sp+1Ch] [+1Ch] BYREF

  setbuf((FILE *)stdout, 0);
  setbuf((FILE *)stdin, 0);
  printf("Give me your flag:");
  scanf("%32s", v5);
  for ( i = 0; i < 32; ++i )
    *((_BYTE *)&i + i + 4) ^= 32 - (_BYTE)i;
  if ( !strncmp(v5, fdata, 5u) )
    result = sub_4007F0(v5);
  else
    result = puts("Wrong");
  return result;
}

fdata的值
在这里插入图片描述

跟进sub_4007F0()函数

int __fastcall sub_4007F0(const char *a1)
{
  char v1; // $v1
  int result; // $v0
  size_t i; // [sp+18h] [+18h]

  for ( i = 5; i < strlen(a1); ++i )
  {
    if ( (i & 1) != 0 )
      v1 = (a1[i] >> 2) | (a1[i] << 6);
    else
      v1 = (4 * a1[i]) | (a1[i] >> 6);
    a1[i] = v1;
  }
  if ( !strncmp(a1 + 5, (const char *)off_410D04, 0x1Bu) )
    result = puts("Right!");
  else
    result = puts("Wrong!");
  return result;
}

经过一个for循环后的值等于off_410D04
shift+E提取数据

unsigned char ida_chars[] =
{
  0x52, 0xFD, 0x16, 0xA4, 0x89, 0xBD, 0x92, 0x80, 0x13, 0x41, 
  0x54, 0xA0, 0x8D, 0x45, 0x18, 0x81, 0xDE, 0xFC, 0x95, 0xF0, 
  0x16, 0x79, 0x1A, 0x15, 0x5B, 0x75, 0x1F
};

i&1等价于判断奇偶,然后进行移位运算

在这里插入图片描述
a1[i] >> 2 | a1[i] << 6
等价于
00 010010 | 01 000000
结果为01 010010
if的两个分支就是简单的左(右)移两位
(一开始在纠结移位的乘法,想来想去想了半天
后面上个厕所 想到二进制的移位就想通了

off_410D04 =[
  0x52, 0xFD, 0x16, 0xA4, 0x89, 0xBD, 0x92, 0x80, 0x13, 0x41, 
  0x54, 0xA0, 0x8D, 0x45, 0x18, 0x81, 0xDE, 0xFC, 0x95, 0xF0, 
  0x16, 0x79, 0x1A, 0x15, 0x5B, 0x75, 0x1F
]
flag=[]

h=list("Q|j{g")
for i in range(len(h)):
     flag.append(ord(h[i])^((0x20 - i)))

#逆向
for i in range(len(off_410D04)):
     if((i&1)!=0):
          res=(off_410D04[i]&0xfc) >> 2 | (off_410D04[i]&0x3 ) << 6
     else:
          res= (off_410D04[i]&0x3f) << 2 | (off_410D04[i]&0xc0) >> 6
     flag.append(res^0x20 - i-5)

"""
#爆破
for i in range(5,len(off_410D04)+5):
     for j in range(32,128):
          tmp=(j^((0x20 - i)))
          if ( (i&1)!= 0 ):
               res = (tmp >> 2) | (tmp << 6)% 0x100
          else:
               res = (tmp<<2)% 0x100 | ((tmp >> 6))
          #print(res)
          if res==off_410D04[i-5]:
               flag.append(j)
"""
for i in flag:
     print(chr(i),end='')

在这里插入图片描述

flag{ReA11y_4_B@89_mlp5_4_XmAn_}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-14 23:31:36  更:2022-04-14 23:34:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:20:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码