buuctf_RE(第三页)

news2024/11/13 8:41:15

[SWPU2019]ReverseMe

找到关键函数,但是很长,也只能分析出一些零碎的东西,看 wp 是通过动调来缕清程序的逻辑的。
一个是用ida,还有一个OD都试试吧
还看到一个大佬是用的 ponce 解的,这个先放放。
调的太难受了 0.0
还是要学会,他有个内存断点

[WUSTCTF2020]funnyre

花指令的去除
有很多标红的地址,按 G 跳转
在这里插入图片描述
最简单方法就是使用 angr

import angr
import claripy
p=angr.Project('./attachment',load_options={"auto_load_libs":False})
f=p.factory
state=f.entry_state(addr=0x400605)
flag=claripy.BVS('flag',32*8)   # request 32 part
state.memory.store(0x603055+0x300+5,flag)  # don't have scanf,so set string into memory directly
state.regs.rdx=0x603055+0x300
state.regs.rdi=0x603055+0x300+5    # set 寄存器

sm=f.simulation_manger(state)
print('ready')
sm.explore(find=0x401dae)
if sm.found:
    print("[+] found!")
    x=sm.found[0].solver.eval(flag,cast_to=bytes)
    print(x)

但也是不好写,有时候还跑不出来

然后可以用暴力破解,tql

dt = [0xd9, 0x2c, 0x27, 0xd6, 0xd8, 0x2a, 0xda, 0x2d, 0xd7, 0x2c, 0xdc, 0xe1, 0xdb, 0x2c, 0xd9, 0xdd, 0x27, 0x2d, 0x2a, 0xdc, 0xdb, 0x2c, 0xe1, 0x29, 0xda, 0xda, 0x2c, 0xda, 0x2a, 0xd9, 0x29, 0x2a]


def kaisa(xx, kk):
    return [(x+kk) & 0xFF for x in xx]


def xor(xx, kk):
    return [x ^ kk for x in xx]


def check(xx):
    for x in xx:
        if x < ord('0') or (x > ord('9') and x < ord('a')) or x > ord('f'):
            return False
    return True


if __name__ == '__main__':
    for k1 in range(0x100):
        tt = kaisa(dt, k1)
        for k2 in range(0x100):
            tt2 = xor(tt, k2)
            if check(tt2):
                print(bytes(tt2))
                print(k1, k2)

也还有一种最稳妥的办法:
在这里插入图片描述
就是 copy 代码
还有idapython提取指令的,额,算了。

[GKCTF 2021]QQQQT

在这里插入图片描述
有导入表和导出表改变好像
Enigma Virtual Box打包的QT程序,先解一下包
解码,得到一个名为%DEFAULT FOLDER%的文件

里面的untitled2.exe为解码后的文件
不是外面那个 unpacked
然后看出 base58
辗转相除法,每次除以58,商作下次被除数,余数去查表
位数:log2(58)(每一个字母代表的信息量是log2(58))

[CISCN2018]2ex

__MACOSX 是 Mac Os 系统应用解压所带
mips-32架构
有专门的工具好像,不过不好弄应该
在这里插入图片描述
这就是个 base64 变表

[ACTF新生赛2020]fungame

在这里插入图片描述
很像 flag 啊,但是提交显示错误,运行,有一会sleep感觉,但是没有回显
在这里插入图片描述
难道是 hook ?
main上面函数翻了一下,又发现一小部分
在这里插入图片描述
猜测是要其直接打印 flag ,但不知道怎么联系起来
在这里插入图片描述
这还有一个
在这里插入图片描述
唉 0.0
这是之前遇到的那个栈溢出的题
在这里插入图片描述
也大致了解了一点

[RoarCTF2019]polyre

都在switch-case里面
在这里插入图片描述
前面一堆if,while啊
关于平坦化和虚假控制流程的题目
之前听过还没学呢
在这里插入图片描述
符号执行去除控制流平坦化
看废了

python3 deflat.py attachment 0x400620 #python版本+脚本名+文件名+起始地址

需要有 angr 库,跑的有几分钟
但可能还是有一点 while if ,有些是永真或者永假
需要自己再写脚本 patch 一下
这个表达式实际上是永远为假的,它因为dword_603058这个全局变量是在bss段上的,bss段上为未初始化的全局变量,所以它就是0。而且查一下它的交叉引用表也会发现与它相关的指令都是作为源操作数而非目的操作数,而且也没有取它地址做某些操作,在此基础之上我们基本可以认为它就是不变的。
在这里插入图片描述
还有永真

if ( dword_603058 < 10 || ((((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054) & 1) == 0 )
break;

也删了
但是 ida python 一些函数还是报错

st = 0x401121
end = 0x402144
def patch_nop(start, end):
    for i in range(start, end):
        patch_byte(i, 0x90)           # 修改指令地址处 0x90 是最简单的1字节nop
def next_instr(addr):
    return addr+ItemSize(addr)      # ItemSize获取指令或数据长度,这个函数的作用就是去往下一条指令
addr = st
while(addr < end):
    next = next_instr(addr)
    if "dword_603058" in GetDisasm(addr):       # GetDisasm(addr)得到addr的反汇编语句
        while(True):
            addr = next
            next = next_instr(addr)
            if "jnz" in GetDisasm(addr):
                dest = GetOperandValue(addr, 0)  # 得到操作数,就是指令后的数
                patch_byte(addr, 0xe9)
                patch_byte(addr+5, 0x90)
                offset = dest - (addr + 5)
                patch_dword(addr + 1, offset)
                print("patch bcf: 0x%x" % addr)
                addr = next
                break
    else:
        addr = next

只会就是一个新的加密
实际上就是CRC32算法—输入一组长度48的字符串,每8个字节分为1组,共6组。对每一组取首位,判断正负。正值,左移一位;负值,左移一位,再异或0xB0004B7679FA26B3。重复判断操作64次,得到查表法所用的表。

__int64 __fastcall main(int a1, char **a2, char **a3)
{
  signed __int64 v4; // [rsp+1E0h] [rbp-110h]
  int i; // [rsp+1E8h] [rbp-108h]
  int v6; // [rsp+1ECh] [rbp-104h]
  int v7; // [rsp+1ECh] [rbp-104h]
  char s1[48]; // [rsp+1F0h] [rbp-100h] BYREF
  char s[60]; // [rsp+220h] [rbp-D0h] BYREF
  unsigned int v10; // [rsp+25Ch] [rbp-94h]
  char *v11; // [rsp+260h] [rbp-90h]
  int v12; // [rsp+26Ch] [rbp-84h]
  bool v13; // [rsp+272h] [rbp-7Eh]
  unsigned __int8 v14; // [rsp+273h] [rbp-7Dh]
  int v15; // [rsp+274h] [rbp-7Ch]
  char *v16; // [rsp+278h] [rbp-78h]
  int v17; // [rsp+284h] [rbp-6Ch]
  int v18; // [rsp+288h] [rbp-68h]
  bool v19; // [rsp+28Fh] [rbp-61h]
  char *v20; // [rsp+290h] [rbp-60h]
  int v21; // [rsp+298h] [rbp-58h]
  bool v22; // [rsp+29Fh] [rbp-51h]
  __int64 v23; // [rsp+2A0h] [rbp-50h]
  bool v24; // [rsp+2AFh] [rbp-41h]
  __int64 v25; // [rsp+2B0h] [rbp-40h]
  __int64 v26; // [rsp+2B8h] [rbp-38h]
  __int64 v27; // [rsp+2C0h] [rbp-30h]
  __int64 v28; // [rsp+2C8h] [rbp-28h]
  int v29; // [rsp+2D0h] [rbp-20h]
  int v30; // [rsp+2D4h] [rbp-1Ch]
  char *v31; // [rsp+2D8h] [rbp-18h]
  int v32; // [rsp+2E0h] [rbp-10h]
  int v33; // [rsp+2E4h] [rbp-Ch]
  bool v34; // [rsp+2EBh] [rbp-5h]

  v10 = 0;
  memset(s, 0, 0x30uLL);
  memset(s1, 0, sizeof(s1));
  printf("Input:");
  v11 = s;
  __isoc99_scanf("%s", v11);
  v6 = 0;
  //输入部分,碰到\n截止
  while ( 1 )
  {
    v12 = v6;
    v13 = v12 < 64;
    if ( !v13 )
      break;
    v14 = s[v6];
    v15 = v14;
    if ( v15 == 10 )
    {
      v16 = &s[v6];
      *v16 = 0;
      break;
    }
    v17 = v6 + 1;
    v6 = v17;
  }

  for ( i = 0; ; ++i )
  {
    v18 = i;
    v19 = v18 < 6;//这里可以看出只有6组
    if ( !v19 )
      break;
    v20 = s;
    v4 = *(_QWORD *)&v20[8 * i];//转为了QWORD,每组八个字节
    v7 = 0;
    while ( 1 )
    {
      v21 = v7;
      v22 = v21 < 64;
      if ( !v22 )
        break;
      v23 = v4;
      v24 = v4 < 0;
      if ( v4 >= 0 )
      {
        v27 = v4;
        v28 = 2 * v27;
        v4 = v28;
      }
      else
      {
        v25 = 2 * v4;
        v26 = v25;
        v4 = v26 ^ 0xB0004B7679FA26B3LL;
      }
      v29 = v7;
      v7 = v29 + 1;
    }
    v30 = 8 * i;
    v31 = &s1[8 * i];
    *(_QWORD *)v31 = v4;
    v32 = i + 1;
  }
  v33 = memcmp(s1, &unk_402170, 0x30uLL);
  v34 = v33 != 0;
  if ( v34 )
    puts("Wrong!");
  else
    puts("Correct!");
  return v10;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

未来互联网的新篇章:深度解析Facebook的技术与战略

随着科技的飞速发展和社会的不断变迁&#xff0c;互联网作为全球信息交流的重要平台&#xff0c;正经历着前所未有的变革和演进。作为全球最大的社交媒体平台之一&#xff0c;Facebook不仅是人们沟通、分享和互动的重要场所&#xff0c;更是科技创新和数字化进程的推动者。本文…

什么是独立成分分析(ICA, Independent Component Analysis)

**独立成分分析&#xff08;ICA, Independent Component Analysis&#xff09;**是一种用于信号处理的统计技术&#xff0c;旨在将多变量信号分解为统计独立的非高斯信号成分。ICA广泛应用于各类信号处理领域&#xff0c;如脑电图&#xff08;EEG&#xff09;、语音信号处理、图…

概率论习题

泊松分布习题 假设你在医院值班&#xff0c;每天需要安保人员出动的次数N~P(1),则关于任一天安保人员出动次数&#xff1a; A&#xff1a;出动一次的概率是多少 B&#xff1a;出动次数小于等于一次的概率为 C&#xff1a;出动次数小于一次的概率为 D&#xff1a;若随机事件发生…

Python Cleanlab库:提升机器学习数据质量

更多Python学习内容&#xff1a;ipengtao.com 在机器学习和数据科学中&#xff0c;数据质量对模型的性能和可靠性有着至关重要的影响。清洗和纠正标签错误的数据是确保模型准确性和泛化能力的关键步骤。Python的Cleanlab库提供了一种便捷且强大的方式来检测和纠正数据中的标签错…

数列分块<1>

本期是数列分块入门<1>。该系列的所有题目来自hzwer在LOJ上提供的数列分块入门系列。 Blog:http://hzwer.com/8053.html sto hzwer orz %%% [转载] -----------------------------------------------------------------…

2024.7.12 暑期训练记录(4)

之后的训练方式是上午板刷2000的题&#xff0c;下午学新算法or vp&#xff0c;如果近期没有新算法要学也不vp就换成继续板刷&#xff0c;晚上补题&#xff0c;没有题要补就继续板刷在尝试新的做题方式&#xff0c;看完题先把主要信息写在纸上&#xff0c;如果有思路就顺着思路走…

分享浏览器被hao123网页劫持,去除劫持的方式

昨天看python相关的自动化工作代码时&#xff0c;发现谷歌浏览器被hao123劫持了&#xff0c;把那些程序删了也不管用 方法1&#xff1a;删除hao123注册表&#xff0c;这个方式不太好用&#xff0c;会找不到注册表 方法2&#xff1a;看浏览器快捷方式的属性页面&#xff0c;一…

redis查询慢,你们是如何排查优化的(运维篇2)

1、开启慢查询日志 首先&#xff0c;第一步&#xff0c;你需要去查看一下 Redis 的慢日志&#xff08;slowlog&#xff09;。 Redis 提供了慢日志命令的统计功能&#xff0c;它记录了有哪些命令在执行时耗时比较久。 查看 Redis 慢日志之前&#xff0c;你需要设置慢日志的阈值。…

ESP32和ESP8266的WIFI的136个问题与答案

ESP32和ESP8266的WIFI的136个问题与答案 ESP32和ESP8266 WIFI相关问题与答案&#xff0c;具有一定的参考价值。ESP32-S3模块 1. ESP32 和 ESP8266 是否支持中文 SSID&#xff1f; ESP32 和 ESP8266 均支持中文 SSID&#xff0c;但需要使用相应的库和设置。需要注意的是&#…

PySide(PyQt)判断QLineEdit的输入是否合规

判断QLineEdit的输入是否符合要求&#xff0c;比如是否为整数或者浮点数。 1、使用正则表达式来判断 符合正则表达式则输入合规 import sys import re from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLineEdit, QLabelclass ExampleWidget(QWidget):…

Eclipse 运行程序

我们可以在 Package Explorer 视图 可以在 Package Explorer 视图中快速运行 Java 程序。 Package Explorer 视图: 鼠标右击包含 main 函数的 java 类选择 Run As > Java Application 同样你也可以在 Package Explorer 视图中选择包含 main 方法的类并按下快捷键&#x…

C++之多态使用小结

1、多态定义 1.1 多态概念 C多态性&#xff08;Polymorphism&#xff09;是面向对象编程(OOP)的一个重要特性之一&#xff0c;它允许我们使用统一的接口来处理不同类型的对象。多态性使得程序更加灵活、可扩展并且易于维护。 通俗来说&#xff0c;就是多种形态&#xff0…

期末成绩发布智能助手

期末考试的结束标志着教师们迎来了成绩处理的忙碌时期。传统的成绩单分发方式不仅耗时耗力&#xff0c;而且容易出错。幸运的是&#xff0c;易查分小程序的出现&#xff0c;为这一过程提供了一个简便而高效的解决方案。 易查分小程序是专为教师和家长设计的智能工具&#xff0…

安卓笔记1-Retrofit2请求自定义接口

1、整体功能概述 安卓项目中使用Retrofit2实现和自定义接口的网络交互&#xff0c;通过Postman模拟服务端&#xff0c;创建自定义接口。 作用 前后端开发进度对不齐时&#xff0c;客户端可利用本功能模拟测试数据。备忘。 缺点 retrofit模拟接口需要配置响应数据类&#xff…

美无定论,娜扎亦菲各自绽放你更爱哪一款?

娜扎亦菲各自绽放你更爱哪一款&#xff1f; 哎呀&#xff0c;这个问题可真是让我头疼呢&#xff0c; 就像让我在两个糖果店里选择最甜的那一颗一样难&#xff01; 古力娜扎和刘亦菲&#xff0c;两位都是娱乐圈里璀璨的明珠&#xff0c; 美得各有千秋&#xff0c;让人怎么舍得…

2024年上半年信息系统项目管理师——综合知识真题题目及答案(第1批次)(3)

2024年上半年信息系统项目管理师 ——综合知识真题题目及答案&#xff08;第1批次&#xff09;&#xff08;3&#xff09; 第41题&#xff1a;在应用集成中&#xff0c;有多个组件帮助协调连接各种应用。其中&#xff08;&#xff09;利用特定的数据结构&#xff0c;帮助开发人…

企业网络实验dhcp-snooping、ip source check,防非法dhcp服务器、自动获取ip(虚拟机充当DHCP服务器)、禁手动修改IP

文章目录 需求相关配置互通性配置配置vmware虚拟机&#xff08;dhcp&#xff09;分配IP服务配置dhcp relay&#xff08;dhcp中继&#xff09;配置dhcp-snooping&#xff08;防非法dhcp服务器&#xff09;配置ip source check&#xff08;禁手动修改IP&#xff09; DHCP中继&…

四. TensorRT模型部署优化-pruning(sparse-tensor-core)

目录 前言0. 简述1. 自动驾驶中需要关注的电力消耗2. Ampere架构中的3rd Generation Tensor core3. Sparse tensor core做矩阵乘法总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们…

【刷题汇总 -- 删除公共字符、两个链表的第一个公共结点、mari和shiny】

C日常刷题积累 今日刷题汇总 - day0121、删除公共字符1.1、题目1.2、思路1.3、程序实现 -- 蛮力法1.4、程序实现 -- 哈希 2、两个链表的第一个公共结点2.1、题目2.2、思路2.3、程序实现 -- 对齐比对法2.4、程序实现 -- 公共端点路程法 3、mari和shiny3.1、题目3.2、思路3.3、程…

Unity如何查找两个transform最近的公共parent

查找两个子对象最近的父对象 一、问题背景二、解决方案思路核心算法代码 三、总结 一、问题背景 最近看到个关于Unity的问题&#xff1a;在Hierarchy面板中的游戏对象&#xff0c;给定两个子物体transform对象&#xff0c;如何查找这两个transform最近的公共父级parent。感觉挺…