REVERSE-COMPETITION-HWS-5TH-2022

REVERSE-COMPETITION-HWS-5TH-2022

    • re1
    • re2
    • re3

re1

64位exe,ida打开,来到main函数
输入的长度应为32,输入经过TEA加密,密文与已知的cipher进行比较
re1-main
进入TEA函数,发现是魔改TEA,需一次性传入8个unsigned int,delta已知,key已知
re1-TEA
用C还原出程序的魔改TEA加密过程,对解密过程进行相应的修正,解密得到flag

#include <stdio.h>
#include <stdint.h>//加密函数
void encrypt(unsigned int num_rounds, uint32_t* v, uint32_t* k) {uint32_t v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3],v4 = v[4], v5 = v[5],v6 = v[6], v7 = v[7],sum = 0;int v15,v17=12;do{sum -= 0x61C88647;v0 += ((sum ^ v1) + (k[(sum >> 2) & 3] ^ v7)) ^ (((16 * v7) ^ (v1 >> 3)) + ((v7 >> 5) ^ (4 * v1)));v[0] = v0;v1 += ((k[(sum >> 2) & 3 ^ 1] ^ v0) + (sum ^ v2)) ^ (((16 * v0) ^ (v2 >> 3)) + ((v0 >> 5) ^ (4 * v2)));v[1] = v1;v2 += ((sum ^ v3) + (k[(sum >> 2) & 3 ^ 2] ^ v1)) ^ (((16 * v1) ^ (v3 >> 3)) + ((v1 >> 5) ^ (4 * v3)));v[2] = v2;v3 += ((sum ^ v4) + (k[(sum >> 2) & 3 ^ 3] ^ v2)) ^ (((16 * v2) ^ (v4 >> 3)) + ((v2 >> 5) ^ (4 * v4)));v[3] = v3;v4 += ((sum ^ v5) + (k[(sum >> 2) & 3] ^ v3)) ^ (((16 * v3) ^ (v5 >> 3)) + ((v3 >> 5) ^ (4 * v5)));v[4] = v4;v5 += ((k[(sum >> 2) & 3 ^ 1] ^ v4) + (sum ^ v6)) ^ (((16 * v4) ^ (v6 >> 3)) + ((v4 >> 5) ^ (4 * v6)));v[5] = v5;v6 += (((sum ^ v7) + (k[(sum >> 2) & 3 ^ 2] ^ v5)) ^ (((16 * v5) ^ (v7 >> 3)) + ((v5 >> 5) ^ (4 * v7))));v[6] = v6;v7 += (((sum ^ v0) + (k[(sum >> 2) & 3 ^ 3] ^ v6))) ^ (((16 * v6) ^ (v0 >> 3))+ ((v6 >> 5) ^ (4 * v0)));v[7] = v7;v15 = v17-- == 1;}while(!v15);printf("sum==0x%x\n",sum);
}//解密函数
void decrypt(unsigned int num_rounds, uint32_t* v, uint32_t* k) {uint32_t v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3],v4 = v[4], v5 = v[5],v6 = v[6], v7 = v[7],sum = 0x6a99b4ac;int v15,v17=12;do{v7 -= (((sum ^ v0) + (k[(sum >> 2) & 3 ^ 3] ^ v6))) ^ (((16 * v6) ^ (v0 >> 3))+ ((v6 >> 5) ^ (4 * v0)));v[7] = v7;v6 -= (((sum ^ v7) + (k[(sum >> 2) & 3 ^ 2] ^ v5)) ^ (((16 * v5) ^ (v7 >> 3)) + ((v5 >> 5) ^ (4 * v7))));v[6] = v6;v5 -= ((k[(sum >> 2) & 3 ^ 1] ^ v4) + (sum ^ v6)) ^ (((16 * v4) ^ (v6 >> 3)) + ((v4 >> 5) ^ (4 * v6)));v[5] = v5;v4 -= ((sum ^ v5) + (k[(sum >> 2) & 3] ^ v3)) ^ (((16 * v3) ^ (v5 >> 3)) + ((v3 >> 5) ^ (4 * v5)));v[4] = v4;v3 -= ((sum ^ v4) + (k[(sum >> 2) & 3 ^ 3] ^ v2)) ^ (((16 * v2) ^ (v4 >> 3)) + ((v2 >> 5) ^ (4 * v4)));v[3] = v3;v2 -= ((sum ^ v3) + (k[(sum >> 2) & 3 ^ 2] ^ v1)) ^ (((16 * v1) ^ (v3 >> 3)) + ((v1 >> 5) ^ (4 * v3)));v[2] = v2;v1 -= ((k[(sum >> 2) & 3 ^ 1] ^ v0) + (sum ^ v2)) ^ (((16 * v0) ^ (v2 >> 3)) + ((v0 >> 5) ^ (4 * v2)));v[1] = v1;v0 -= ((sum ^ v1) + (k[(sum >> 2) & 3] ^ v7)) ^ (((16 * v7) ^ (v1 >> 3)) + ((v7 >> 5) ^ (4 * v1)));v[0] = v0;sum += 0x61C88647;v15 = v17-- == 1;}while(!v15);printf("sum==0x%x\n",sum);
}//打印数据 hex_or_chr: 1-hex 0-chr
void dump_data(uint32_t * v,int n,bool hex_or_chr)
{if(hex_or_chr){for(int i=0;i<n;i++){printf("0x%x,",v[i]);}}else{for (int i = 0; i < n; i++){for (int j = 0; j < sizeof(uint32_t)/sizeof(uint8_t); j++){printf("%c", (v[i] >> (j * 8)) & 0xFF);}}}printf("\n");return;
}int main()
{// v为要加解密的数据uint32_t v[] = { 0x10bd3b47,0x6155e0f9,0x6af7ebc5,0x8d23435f,0x1a091605,0xd43d40ef,0xb4b16a67,0x6b3578a9 };// k为加解密密钥uint32_t k[6] = { 0x1234, 0x2345, 0x4567, 0x6789, 0, 0 };// num_rounds,建议取值为32unsigned int r = 32;int n = sizeof(v) / sizeof(uint32_t);/*printf("加密前明文数据:");dump_data(v,n,1);for(int i=0;i<n/2;i++){encrypt(r,&v[i*2], k);}*/printf("加密后密文数据:");dump_data(v,n,1);/*for(int i=0;i<n/2;i++){decrypt(r,&v[i*2], k);}*/decrypt(0,v,k);printf("解密后明文数据:");dump_data(v,n,1);printf("解密后明文字符:");dump_data(v,n,0);return 0;
}// 7f943921724d63dc0ac9c6febf99fa88

re2

32位exe,ida打开,来到main函数
main函数读取输入,没有对输入的其他处理
re2-main
对输入查找交叉引用,来到sub_4013D0函数,输入和下标异或,结果与已知的res比较
re2-xref
解异或得知是假flag,左边函数窗口看到tls,有一段SMC
re2-tls
解SMC,在StartAddress处创建函数,反编译,输入和byte_41B30A异或,调试得到byte_41B30A==0x48
re2-RC4
然后对输入进行RC4加密,密钥为"Qfrost",密文为0x401307地址处开始的28个字节
re2-cipher
re2-cipher
解密RC4,再异或0x48即可得到flag

#include<stdio.h>/*
RC4初始化函数
*/
void rc4_init(unsigned char* s, unsigned char* key, unsigned long Len_k)
{unsigned int i = 0, j = 0;char k[256] = { 0 };unsigned char tmp = 0;for (i = 0; i < 256; i++) {s[i] = i;k[i] = key[i % Len_k];}for (i = 0; i < 256; i++) {j = (j + s[i] + k[i]) % 256;tmp = s[i];s[i] = s[j];s[j] = tmp;}
}/*
RC4加解密函数
unsigned char* Data     加解密的数据
unsigned long Len_D     加解密数据的长度
unsigned char* key      密钥
unsigned long Len_k     密钥长度
*/
void rc4_crypt(unsigned char* Data, unsigned long Len_D, unsigned char* key, unsigned long Len_k) //加解密
{unsigned char s[256];rc4_init(s, key, Len_k);int i = 0, j = 0, t = 0;unsigned long k = 0;unsigned char tmp;for (k = 0; k < Len_D; k++) {i = (i + 1) % 256;j = (j + s[i]) % 256;tmp = s[i];s[i] = s[j];s[j] = tmp;t = (s[i] + s[j]) % 256;Data[k] = Data[k] ^ s[t] ^ 0x48;}
}
int main()
{//字符串密钥unsigned char key[] = "Qfrost";unsigned long key_len = sizeof(key) - 1;/*//数组密钥unsigned char key[] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10};unsigned long key_len = sizeof(key);*///加解密数据unsigned char data[] = {0x7F, 0xB6, 0x88, 0x12, 0xDC, 0xC3, 0xDE, 0xDB, 0x30, 0x24, 0xE3, 0xC1, 0x0F, 0xC9, 0x7F, 0xC2, 0x4D, 0x9C, 0x6B, 0x02, 0x26, 0x20, 0xF1, 0x25, 0xA0, 0xE3, 0xC6, 0xDE };//加解密rc4_crypt(data, sizeof(data), key, key_len);for (int i = 0; i < sizeof(data); i++){printf("%c", data[i]);}printf("\n");return 0;
}// QDbg-Is_an_1ntereSting-Game!

re3

安卓逆向,jadx-gui打开
输入的长度应小于420,trans是将输入的字符,三个一组,转成36进制,每组存储为两个字节
re3-main
ida打开so文件,Java_com_example_ctf_MainActivity_check没什么用
re3-jni
对输入的校验在JNI_OnLoad的sub_D060方法
通过调试知道,for循环将传入的36进制转为16进制,这里会被char类型截断
re3-rsa
然后是RSA加密,n和e已知,密文和sure_flag的20个字节比较
解RSA,将明文用16进制表示,每两个16进制转成三个10进制,不足三位的补0即可

import gmpy2
n=0x7019325b70f4a2f26e921102a0206de415caeb535cd4ec9d23d6608630dd00a9db5db8faef4621ccb2e775844c7447a1a843ebac03eca6f329feabcd6560b80aacf7a54a298548827c9d75e1450fcf7e53dac37c0f7fd25d509c342c23bda0619504b28ec903c56c87
p=1475203612633975218848450285487339190962027688336790188873776418606441616307026173067
q=1475203612633975218848450285487339190962027688336790188873776418606441616307046219549
r=1475203612633975218848450285487339190962027688336790188873776418606441616307129708089
e=0x10001
phin=(p-1)*(q-1)*(r-1)
d=gmpy2.invert(e,phin)
c=0x4920616D207375726520697420697320666C3467
m=gmpy2.powmod(c,d,n)
s=hex(m)[2:]
flag=""
for i in range(0,len(s),2):tmp=int(s[i:i+2],16)if tmp<100:flag+="0"flag+=str(tmp)
print(flag)
# 037087131219012107229231067248093076089082070175138132195124126254031088197066063081248248223201185154047168242228140155089071245228045160218140167117182217137118206104215018068031237111113041220252131252040018130017184197145113066057103096226240251147039224115177108218078236161028053035089246229073211242029209057

输入验证成功,但是貌似多解,不太理解怎么回事

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

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

相关文章

Selenium 显式等待条件及其含义

等待条件含义title_is标题是某内容title_contains标题包含某内容presence_of_element_located节点加载出&#xff0c;传入定位元组&#xff0c;如 (By.ID, ‘p’)visibility_of_element_located节点可见&#xff0c;传入定位元组visibility_of可见&#xff0c;传入节点对象pres…

终于找到了:NuGet 修改包路径

NuGet 是 .NET 平台下的一个免费、开源的包管理开发工具。 修改全局包管理目录 通过 NuGet 安装包时&#xff0c;NuGet 先将包下载至一个统一的目录&#xff0c;默认路径是&#xff1a;C:Users用户名.nugetpackages 下载的包多了以后&#xff0c;会导致 C 盘空间被大量占用。…

REVERSE-COMPETITION-DSCTF-2022

REVERSE-COMPETITION-DSCTF-2022catchmeFFunctionnothingbad_applefantastic_cpucatchme 安卓逆向&#xff0c;java层传递输入&#xff0c;调用native层的check方法 ida打开.so文件&#xff0c;没有直接找到check方法&#xff0c;JNI_OnLoad也看不出什么 Findcrypt查到AES的S盒…

01-单一职责原则(SPR)

1. 背景 类T负责两个不同的职责&#xff1a;职责P1&#xff0c;职责P2。当由于职责P1需求发生改变而需要修改类T时&#xff0c;有可能会导致原本运行正常的职责P2功能发生故障。 2. 定义 不要存在多于一个导致类变更的原因。通俗的说&#xff0c;即一个类只负责一项职责。 3.…

Windows/Android/iOS 等常见 User-Agent 大全

User Agent 中文名为用户代理&#xff0c;简称 UA&#xff0c;是一个特殊字符串头&#xff0c;使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。Python 爬虫通过伪装 UA 可以绕过某些检测。 以下为搜集的常见…

Python3 已经安装相关库,Pycharm 仍然报错 ModuleNotFoundError: No module named 'xxxxxx' 的解决办法

以 requests 库为例&#xff0c;打开 cmd&#xff0c;运行命令 pip install requests&#xff0c;即可安装 requests 库&#xff0c;由于我已经安装过&#xff0c;所以会提示 Requirement already satisfied 此时&#xff0c;我们使用 Pycharm 运行以下代码&#xff1a; impo…

Python3 爬虫学习笔记 C05 【Selenium + 无界面浏览器】

Python3 爬虫学习笔记第五章 —— 【Selenium 无界面浏览器】文章目录【5.1】关于无界面浏览器【5.2】PhantomJS【5.3】Headless Chrome【5.4】Headless Firefox【5.1】关于无界面浏览器 无界面&#xff08;headless&#xff09;浏览器&#xff0c;会把网站加载到内存并执行页…

Python3 爬虫学习笔记 C06 【正则表达式】

Python3 爬虫学习笔记第六章 —— 【正则表达式】文章目录【6.1】关于正则表达式【6.2】re.match() 方法【6.2.1】提取内容【6.2.2】通用匹配【6.2.3】贪婪匹配【6.2.4】非贪婪匹配【6.2.5】转义匹配【6.2.6】修饰符【6.3】re.search() 方法【6.4】re.findall() 方法【6.5】re.…

Sharepoint学习笔记—Site Definition系列-- 3、创建ListDefinition

创建一个List Definition有多条途径&#xff0c;这里由于我们要基于前面的用户自定义Content Type来创建一个List Defintion&#xff0c;所以我们就需要使用到List Definition From Content Type模板。 这里先大致描述如何创建List Definition&#xff0c;然后重点介绍一下Li…

Python3 爬虫学习笔记 C07 【解析库 lxml】

Python3 爬虫学习笔记第七章 —— 【解析库 lxml】文章目录【7.1】关于 lxml【7.2】使用 XPath【7.3】查找所有节点【7.4】查找子节点【7.5】查找父节点【7.6】属性匹配【7.7】文本获取【7.8】属性获取【7.9】一个属性包含多个值的匹配【7.10】多个属性匹配一个节点【7.11】按顺…

Sharepoint学习笔记—error处理-- The user does not exist or is not unique.

看到网上不少人遇到过这种类似的错误&#xff0c;而产生这种错误的原因也有多种&#xff0c;我产生此错误的背景是在试图通过ECMAscript对象模型把一个User添加到某个指定的Group中时遇到的。 问题1.当我试图把一个User添加到Sharepoint的某个指定的Group&#xff0c;…

Python3 爬虫学习笔记 C08【解析库 Beautiful Soup】

Python3 爬虫学习笔记第八章 —— 【解析库 Beautiful Soup】文章目录【8.1】关于 Beautiful Soup【8.2】Beautiful Soup 的基本使用【8.3】节点选择器【8.3.1】元素选择【8.3.2】提取信息【8.3.3】嵌套选择【8.3.4】关联选择【8.4】方法选择器【8.4.1】find_all() 方法【8.4.2…

Sharepoint学习笔记—Ribbon系列

为便于查阅&#xff0c;这里整理并列出了我的Sharepoint学习笔记中涉及Ribbon开发的关文章&#xff0c;有些内容可能会在以后更新。 Sharepoint学习笔记—Ribbon系列-- 1. Ribbon的架构 Sharepoint学习笔记—Ribbon系列-- 2. 在Ribbon中添加新Tab Sharepoint学习笔记—Ribbo…

Python3 爬虫学习笔记 C09【数据储存系列 — 文件储存】

Python3 爬虫学习笔记第九章 —— 【数据储存系列 — 文件储存】文章目录【9.1】TXT 文本存储【9.1.1】基本示例【9.1.2】打开方式【9.2】JSON 文件存储【9.2.1】对象和数组【9.2.2】读取 JSON【9.2.3】写入 JSON 文件【9.3】CSV 文本存储【9.3.1】写入【9.3.2】读取用解析器解…

Knockout学习笔记之二($root,$parent及$data的区别)

以下是我从Google上找到的一个例子&#xff0c;非常生动形象&#xff0c;我修改了部分代码&#xff0c;具体内容如下&#xff1a; 对于$root 与$parent的区别&#xff1a; $root refers to the view model applied to the DOM with ko.applyBindings;译&#xff1a;$root 是指…

GitHub 学生认证,申请 GitHub 学生包

GitHub 面对学生推出了学生认证服务&#xff0c;通过认证后就可以得到学生包&#xff0c;学生包大概有十几项优惠&#xff0c;包括 DATADOG Pro 帐户、免费两年的10台服务器&#xff0c;Icons8 3个月的带图标&#xff0c;照片&#xff0c;插图和音乐订阅服务、JETBRAINS 专业桌…

Sharepoint学习笔记—架构系列

为便于查阅&#xff0c;这里整理并列出了我的Sharepoint学习笔记中涉及架构方面的有关文章&#xff0c;有些内容可能会在以后更新。 Sharepoin学习笔记—架构系列-- Sharepoint的网页(Page)&#xff0c;网页解析(Parsing)与解析安全处理(Security) Sharepoin学习笔记 —架构…

Python3 使用 pymysql 连接 MySQL 建表时出现 Warning3719 UTF8 警告

在学习 Python3 爬虫关系型数据库储存时&#xff0c;利用 pymysql 连接 MySQL 建表&#xff0c;测试用的代码如下&#xff0c;第一句 SQL 用于获取当前 MySQL 的版本信息&#xff0c;第二句 SQL 执行创建 spiders 数据库的操作&#xff0c;如果程序代码正确&#xff0c;将会输出…

Sharepoin学习笔记—架构系列--01 Sharepoint的网页(Page),网页解析(Parsing)与解析安全处理(Security)

Microsoft SharePoint Foundation 中主要有两种类型的页面&#xff0c;分别是应用程序页(Application Page) 和网站页(Site Page)。 应用程序页(Application Page) 和网站页(Site Page)都从同一母版页继承其布局。 应用程序页(Application Page)与传统的 Microsoft ASP.NET 3.5…

完美解决 bash: hexo: command not found

背景介绍&#xff1a;有好几天没动过 Hexo 博客了&#xff0c;今天准备更新的时候输入 hexo s&#xff0c;报错 bash: hexo: command not found&#xff0c;这是啥情况&#xff1f;以前都好好的&#xff0c;想了一下&#xff0c;大概是这几天折腾各种 Python 库的原因&#xff…