GDOUCTD NSSCTF2023广东海洋大学比赛WP RE(上) Tea Check_Your_Luck

news2024/9/23 23:34:12

Check_Your_Luck

下载文件是cpp
在这里插入图片描述
是个解方程的题,用python的z3

from z3 import *
v,w,x,y,z=BitVecs('v w x y z',16)

l=Solver()
l.add(v * 23 + w * -32 + x * 98 + y * 55 + z * 90 == 333322)
l.add(v * 123 + w * -322 + x * 68 + y * 67 + z * 32 == 707724)
l.add(v * 266 + w * -34 + x * 43 + y * 8 + z * 32 == 1272529)
l.add(v * 343 + w * -352 + x * 58 + y * 65 + z * 5 == 1672457)
l.add(v * 231 + w * -321 + x * 938 + y * 555 + z * 970 == 3372367)
if l.check() == sat:
    print(l.model())
else:
    print ('Error')
#[y = 1754, z = 777, x = 677, w = 123, v = 4544]

在这里插入图片描述

Tea

打开可执行文件有输出,直接打开ida
shift+F12点进去
在这里插入图片描述
在这里插入图片描述
他提示你,这是假的flag,看看哪个函数引用了它,往上追,就来到了关键的地方

__int64 sub_140016230()
{
  char *v0; // rdi
  __int64 i; // rcx
  char v3[32]; // [rsp+0h] [rbp-20h] BYREF
  char v4; // [rsp+20h] [rbp+0h] BYREF
  int v5; // [rsp+24h] [rbp+4h]
  int v6; // [rsp+44h] [rbp+24h]
  int v7[12]; // [rsp+68h] [rbp+48h] BYREF
  _DWORD v8[16]; // [rsp+98h] [rbp+78h] BYREF
  int v9[31]; // [rsp+D8h] [rbp+B8h] BYREF
  int j; // [rsp+154h] [rbp+134h]
  int k; // [rsp+174h] [rbp+154h]
  int m; // [rsp+194h] [rbp+174h]

  v0 = &v4;
  for ( i = 102i64; i; --i )
  {
    *(_DWORD *)v0 = -858993460;
    v0 += 4;
  }
  sub_14001137F(&unk_140023009);
  v5 = 32;
  v6 = 0;
  v7[0] = 1234;
  v7[1] = 5678;
  v7[2] = 9012;
  v7[3] = 3456;
  memset(v8, 0, 0x28ui64);
  v9[15] = 0;
  v9[23] = 0;
  sub_1400113E8();
  for ( j = 0; j < 10; ++j )
    sub_1400111FE("%x", &v8[j]);
  sub_140011339(v7);
  sub_140011145(v8, v9);
  sub_1400112B7(v8, v7);
  v6 = sub_140011352(v8);
  if ( v6 )
  {
    printf("you are right\n");
    for ( k = 0; k < 10; ++k )
    {
      for ( m = 3; m >= 0; --m )
        printf("%c", (unsigned __int8)((unsigned int)v9[k] >> (8 * m)));
    }
  }
  else
  {
    printf("fault!\nYou can go online and learn the tea algorithm!");
  }
  sub_140011311(v3, &unk_14001AE90);
  return 0i64;
}

最后一句话提醒了我们这是tea加密
最后v9输出flag。
v6 = sub_140011352(v8);
进去发现是一个返回值为bool类型的函数
在这里插入图片描述
说明了形参a1等于v8
由此我们知道了tea加密后的v8的值
sub_1400112B7(v8, v7);
进入这个函数,就是魔改版的茶加密,在解密前,我们还要知道v7
的值。
sub_140011339(v7);
进入这个函数,直接对v7进行赋值。
在这里插入图片描述
然后我们再解密,我们首先把加密改成c语言形式

for (int i = 0; i <= 8; ++i )
    {
    v5 = 0;
    v6 = 256256256 * i;
    v3 = i + 1;
    do
    {
      ++v5;
      v8[i] += v6 ^ (v8[v3]+ ((v8[v3] >> 5) ^ (16 * v8[v3]))) ^ (v6 + v7[v6&3]);
      v8[v3] += (v6 + v7[(v6>>11)&3]) ^ (v8[i]+ ((v8[i] >> 5) ^ (16 * v8[i])));
      v6 += 256256256;
    }
    while ( v5 <= 0x20 );
    }

之后再逆向写,为了检验正确性,自己可以赋值一组数,然后互相解密,看看结果对不对

#include <bits/stdc++.h>

using namespace std;
int sub_140011339(int *a1)
{
    int v6;
    int v7;
    int v8;
    int v9;
    v6 = 2233;
    v7 = 4455;
    v8 = 6677;
    v9 = 8899;
    *a1 = 2233;
    *(a1+1) = v7;
    *(a1+2) = v8;
    *(a1+3) = v9;
    return 0;
}
int main()
{
    int v7[12];
    unsigned int v8[15];
    int v5,v6,v3;
    v7[0] = 1234;
    v7[1] = 5678;
    v7[2] = 9012;
    v7[3] = 3456;
    sub_140011339(v7);
    //cout<<v7[3]<<endl;
    v8[0] = 444599258;
    v8[1] = 4154859931;
    v8[2] = 1226314200;
    v8[3] = 4060164904;
    v8[4] = 359413339;
    v8[5] = 1013885656;
    v8[6] = -2066432216;
    v8[7] = -249921817;
    v8[8] = 856928850;
    v8[9] = 3718242937;
    for (int  i = 8; i >= 0; --i )
    {
        v5 = 0;
        v6 = 0xF462900 * i;
        v3 = i + 1;
        v6=v6+(33*0xF462900);
        do
        {
            v6-=0xF462900;
            v8[v3]-=(v6+v7[(v6>>11)&3])^(v8[i]+((v8[i]>>5)^(16 * v8[i])));
            v8[i]-=v6^(v8[v3]+((v8[v3]>>5)^(16*v8[v3])))^(v6+v7[v6&3]);
            ++v5;
        }
        while ( v5 <= 0x20 );
    }
    /*for(int j=0;j<10;j++)
    cout<<v8[j]<<endl;*/
    for (int k = 0; k < 10; ++k )
    {
      for (int m = 3; m >= 0; --m )
        printf("%c",(v8[k] >> (8 * m)));
    }
    return 0;
}

要注意不能把v8定义成int类型,要定义成unsigned int类型

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

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

相关文章

openEuler RISC-V 23.03 创新版本亮相:全面提升硬件兼容性和桌面体验

近日&#xff0c;openEuler RISC-V 23.03 创新版本正式发布。openEuler RISC-V SIG 作为 openEuler 系统在 RISC-V 架构上的维护组织&#xff0c;主要致力于 openEuler 在 RISC-V 软硬件方面的适配&#xff0c;一直跟随 openEuler 版本节奏提供 openEuler 的 RISC-V 镜像版本。…

Redis源码之SDS简单动态字符串

Redis 是内存数据库&#xff0c;高效使用内存对 Redis 的实现来说非常重要。 看一下&#xff0c;Redis 中针对字符串结构针对内存使用效率做的设计优化。 一、SDS的结构 c语言没有string类型&#xff0c;本质是char[]数组&#xff1b;而且c语言数组创建时必须初始化大小&#…

图片转PDF怎么转换?快学习这三种免费转换方法!

图像转PDF功能是指将图像文件转换为PDF文件的过程。PDF&#xff08;PortableDocumentFormat&#xff09;它是一种文件类型&#xff0c;可以存储许多元素&#xff0c;如文本、图像和报告。PDF文档具有跨平台、可打印、可搜索等优点&#xff0c;因此广泛应用于文档共享、文档存储…

Qt扫盲-QAbstractSeries理论总结

QAbstractSeries理论总结 一、概述二、常用函数1. 属性2. 设置功能3. 显示隐藏4. 与 绘图的交互 三、信号 一、概述 QAbstractSeries类是所有Qt图表线的基类。通常&#xff0c;特定于序列类型的继承类会被使用&#xff0c;而不是这个基类。这个基类只是提供了一些管理和控制这…

多功能科学计算器:Magic Number 2 Mac中文

Magic Number Mac - 让数学更简单。当你能正确地看待数学&#xff0c;能够输入你的想法&#xff0c;并凭直觉做每件事时&#xff0c;数学就会变得轻而易举。从日常数学到高级科学&#xff0c;Magic Number 让您事半功倍——无论您的水平如何。欢迎需要的朋友下载使用&#xff0…

IDEA中使用Git提交代码

在IDEA中使用git提交代码到远程仓库&#xff0c;整体可分为如下几个步骤&#xff1a; 前提&#xff1a;注册有GitHub或者gitee账号&#xff1b;本地安装有git。 1.创建远程仓库&#xff08;github或者gitee&#xff09;&#xff1b; 2.创建本地仓库并提交代码到本地仓库&#x…

2023年如何成为一名优秀的大前端Leader?

目录 一、0-1开发vs低代码 二、优点与缺点 先以JNPF为例&#xff0c;展开说说优点&#xff1a; 1、开发周期短&#xff08;这点我愿称之为神&#xff09;&#xff1a; 2、开发成本低 3、助力企业适用市场 再来说说缺点&#xff1a; 1、平台越成熟&#xff0c;费用越高 …

【动态规划】经典问题第三组---背包问题基础

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启算法的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请收藏点赞关注支持一波, 感激不尽~~ 刷题专栏在这里~~ 简单介绍一下什么是背包问…

再学C语言50:C库中的字符串函数(2)

一、strcmp()函数 功能&#xff1a;对字符串内容进行比较&#xff0c;如果两个字符串参数相同&#xff0c;函数返回0 示例代码&#xff1a; /* test of strcmp() function */ #include <stdio.h> #include <string.h>#define NAME "Forster"int main(…

rem实现移动端自适应

rem实现自适应的原理&#xff1a;就是屏幕的宽度/任意数&#xff08;推荐设计稿除下来是整数&#xff0c;方便计算&#xff09;&#xff0c;接着设置根html的font-size为这个数&#xff0c;比如设计师给我们的设计稿宽度为750px&#xff0c;我们可以用750/7.5得到100再赋值给ht…

rnn、lstm、cnn、transformer

rnn不能并行的原因&#xff1a;不同时间步的隐藏层之间有关联。 rnn中batch的含义 如何理解RNN中的Batch_size&#xff1f;_batch rnn_Forizon的博客-CSDN博客 rnn解决的问题 不定长输入带有顺序的序列输入1 rnn前向传播 2 rnn中的反向传播 还有loss对其他参数的求导&#…

Flutter渲染原理

一 Widget Element RenderObject 之间的关系 1 Widget 在Flutter 中&#xff0c;万物皆是Widget,无论是可见的还是功能型的。一切都是Widget. 官方文档中说的Widget 使用配置和状态来描述View 界面应该长什么样子。 它不仅可以表示UI元素&#xff0c;也可以表示一些功能性的…

前端学习:HTML JavaScript

目录 一、JavaScript 使HTML页面更具有动态性和交互性 浏览器中的 JavaScript 能做什么&#xff1f; 二、 HTML三、HTML标签 ​编辑四、JavaScript 的功能示例 1. JavaScript 能够更改内容&#xff1a; 2. JavaScript能够更改样式&#xff1a;3.JavaScript能够更改属性 五、…

拼多多运营中需要采集淘宝天猫京东平台商品详情页面数据上架拼多多店铺,如何使用技术封装接口实现

业务背景&#xff1a;电商平台趋势&#xff0c;平台化。大家可以看到大的电商都开始有自己的平台&#xff0c;其实这个道理很清楚&#xff0c;就是因为这是充分利用自己的流量、自己的商品和服务大效益化的一个过程&#xff0c;因为有平台&#xff0c;可以利用全社会的资源弥补…

FT2000+ openEuler 20.03 virsh创建qemu kvm虚拟机 启动qemu kvm

安装qemu、libvirt yum install libvirt libvirt-client -y yum install qemu -y 安装固件包 yum install edk2-aarch64 固件文件 配置/etc/libvirt/libvirtd.conf auth_tcp "sasl" listen_tcp 1 listen_tls 0 tcp_port "16509" unix_sock_dir …

RK3588_X703 音频调试笔记

x703项目扩接板有接喇叭音频&#xff0c;硬件如下&#xff1a; 喇叭SPK播放无声的时候&#xff0c;首先要测R43贴片电压正常。 需要dts中正确配置SPK_CTL_H的GPIO脚&#xff1a; es8316_sound: es8316-sound {status "okay";compatible "rockchip,multicodec…

javaScript---js如何实现继承

目录 1、构造函数继承 2、原型链继承 3、组合继承 4、class继承 5、寄生组合继承 JavaScript 是以对象为基础&#xff0c;以函数为模型&#xff0c;以原型为继承的面向对象开发模式。 javascript继承的作用&#xff1a; 可以不调用“父类”的构造方法就创造新的实例&…

JavaScript 基础入门速成上篇

JavaScript 嵌入页面的方式 1. 行间事件 <button onclick"alert(点击按钮)">按钮</button> 2. script标签 <script type"text/javascript">console.log(Hello javascript !) </script> 3. 外部引入 <script type"t…

并发编程三要素:可见性、原子性、有序性

一、介绍 1、什么是可见性、原子性、有序性&#xff1f; 可见性&#xff08;visibility&#xff09;&#xff1a;指一个线程对共享变量的修改能够被其他线程立即看到的特性。在多线程环境下&#xff0c;如果一个线程修改了一个共享变量的值&#xff0c;那么其他线程可能无法立…

时隔两个多月,一起来看ChatGPT现况如何?

ChatGPT这股风吹了两个多月&#xff0c;时至今日&#xff0c;各平台上与ChatGPT相关的文章&#xff0c;到现在依旧拥有着不小的流量。三月中旬上线了ChatGPT-4&#xff0c;与我们的文心一言前后脚发布&#xff0c;而后阿里的“通义千问”也展现了不俗的实力&#xff0c;那到现在…