全国大学生信息安全竞赛writeup--暗号(reverse300)
描述
George是一名FBI特工,昨天他获得了一个命令,在今天晚上纽约林肯中心的大都会歌剧院的演唱会上,将会有恐怖分子出没。George下午结果了一名恐怖分子,在他的身上发现了一个U盘,里面有这样一个程序。George看了程序之后,决定将自己伪装成刚解决掉的恐怖分子的身份。请你帮助George获得这名恐怖分子的姓名和暗号。
注:为MadFrog生成注册码
tips:flag是flag{暗号}
附件描述:
文件名:确认姓名和暗号的程序
校验(SHA1):DC0CB7AF31E70514CD63DEC7B2E57CAAB4E8888E
思路
打开发现还是一个登陆,逆向发现有so。check函数在so里,要看把check函数看懂需要一些功夫。注意要把一些已知的JNIEnv *env参数改回来,IDA在逆向的时候可能当做int处理了。不然有一些带偏移的函数指针会不知道是什么。 基本上把这个改了之后就好懂多了,SO创建了一个服务器一个客户端。
服务器接收客户端的数据,并和hhxptgdlffojwztpewc进行比较,观察是否一样,如果一样,发送返回的数据hehehhehe。
客户端将输入的字符串经过一连串加密之后发送已加密的数据给服务器端,如果结果是hehehhehe则成功。
加密算法大致如下
bool check(char *str, int len)
{char encode[202], needstr[202], src;char checkstr[202] = "hhxptgdlffojwztpewc";int i, b, c, e, idx, which;char *strPiece;char *finalStr = (char *)malloc(2020);memset(finalStr, 0, sizeof(char) * 1111);if (!has[len]){printf("checking len:%d\n", len);has[len] = true;}len = strlen(str);i = 0;while (i < len){sprintf(&encode[3 * i], "%03d", str[i]);i++;}puts(encode);memset(needstr, '0', sizeof(needstr));idx = 0;which = 0;for (i = 0;;i = 0){while (i < len){b = 100 * encode[3 * i] + 1000 * idx;c = 3 * i;i++;strPiece = &encode[c];e = b + 10 * encode[c + 1] + encode[c + 2] - 5328;printf("b:%d c:%d e:%d idx:%d\n", b, c, e, idx);idx = e % 26;e /= 26;encode[c] = e / 100 + 48;strPiece[1] = e % 100 / 10 + 48;strPiece[2] = e % 10 + 48;printf("after: %c%c%c\n", encode[c], strPiece[1], strPiece[2]);getchar();}sprintf(&src, "%c", idx + 97);which++;strcat(finalStr, &src);puts(encode);if (!memcmp(encode, needstr, 3 * len))break;idx = 0;}printf("hey, the string is \"%s\"\n", finalStr);return true;
}
这是我还原的加密算法,中间有一些用来观察数据特征的输出,可以删掉。 不过根据这样的观察,我们会发现(当然也可以用数学推理,稍显复杂),其加密过程大致如下。
每一轮得到一个字符。首先将一个字符串还原成ASCII的字符串,比如abc 会变为 097098099 三位一组。然后开始进行一轮运算,每一轮运算,又包括从左至右的n组运算,每一组运算将ascii值提出来,比如097就提为97,然后对26取模,得19,于是将19作为千位再加上下一组ascii值,继续进行运算。而当前位将由ascii值+上一位遗留作为千位的值 再除26得到商,商即是该位的值,余数即是留给下一位的值。下面举例说明:
097 098 099 第一次运算后 得到98%26 = 19,作为千位加下一位得19098,第一位为98/26 = 3,
下一位19098%26=14,作为千位加下一位得14099,第二位为19098/26=734,最后第三位为14099/26 = 542. 第三位得到的余数14099%26=7,即为第一轮得到的字母在字母表中的索引,即’a’+7 = ‘h’
下一轮运算则由 003 734 542 继续进行一样的运算,直到所有位都为0.
逆向这个算法,每一位有用的值都为除法后的商和余数,另x为这个值,(x - y) * t = 原值,最后由于全为0,所以最后的余数就是最后一位在字母表中的索引,根据这个逆推就可以了,逆推方式,最后一个值作为余数,倒数第二个字母在字母表中的索引即为商,然后一轮一轮逆推。
其他不懂的见逆推代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
string password = "hhxptgdlffojwztpewc";
#define GETIDX(X) (X - 'a')
void solve(int len)
{int num[10];bool init = true;int delta = 0;memset(num, 0, sizeof(num));for (int i = password.length() - 1;i >= 0;i--){if (init){init = false;num[len - 1] = GETIDX(password[i]);goto nextLoop;}for (int j = len - 1;j >= 0;j--) {if (true){delta = (j == len - 1)?GETIDX(password[i]):delta;num[j] *= 26; num[j] += delta;delta = num[j] / 1000;num[j] %= 1000;printf("j:%d delta:%d\n", j, delta);}}nextLoop:for (int i = 0;i < len;i++)printf("%d ", num[i]);printf("\n");}for (int i = 0;i < len;i++)printf("%c", num[i]);printf("\n");}
int main()
{solve(9);return 0;
}
后记(吐槽)
真是逼出了我的算法老本。
全国大学生信息安全竞赛writeup--暗号(reverse300)相关推荐
- 计算机弹奏卡布奇诺,计算机学院信息安全技术协会卡布奇诺加糖队在第十二届全国大学生信息安全竞赛中喜获佳绩...
7月27号,第十二届全国大学生信息安全竞赛--创新实践能力赛在电子科技大学圆满结束.我校信息安全技术协会卡布奇诺实验室派出2支队伍参加本次竞赛,并在指导老师刘朝晖的精心指导下获得全国三等奖的好成绩. ...
- 突出计算机学院的比赛名,学院在2019年全国大学生信息安全竞赛安徽省赛中喜获佳绩...
由安徽省教育厅主办的全国大学生信息安全竞赛安徽省赛,共设安徽省大学生网络攻防赛和安徽省大学生信息安全作品赛两项分赛事.学院由计算机学院组织多个团队参赛,分别获得2019年安徽省大学生网络攻防赛一等奖一 ...
- 第十三届全国大学生信息安全竞赛(线上初赛)
第十三届全国大学生信息安全竞赛(线上初赛) 干啥啥不行,混子第一名,全靠躺,,,,,队友带飞! WEB easyphp 打开题目拿到源码: 根据题目的描述,让进程异常退出,进入到phpinfo中 pa ...
- 计算机网络空间安全大赛报道,网络空间安全学院成功举办第十三届全国大学生信息安全竞赛线上宣讲会...
3月28日晚,网络空间安全学院召开2020年第十三届全国大学生信息安全竞赛宣讲会.本次线上宣讲会由学院副院长刘志强指导,张慧翔和邰瑜组织.网络空间安全学院.自动化学院.计算机学院.软件学院等约70名本 ...
- 赛宁首创革新赛制助力人才培养 | 第十六届全国大学生信息安全竞赛-创新实践能力赛全面启动!
为积极响应国家网络空间安全人才战略,加快攻防兼备创新人才培养步伐,实现以赛促学.以赛促教.以赛促用,推动网络空间安全人才培养和产学研用生态发展,由国防科技大学与中国科学技术大学联合承办的第十六届全 ...
- re学习笔记(101)i春秋 全国大学生信息安全竞赛 计时挑战
本文首发于 i春秋公众号 巧用Frida与Unidbg快速在CTF中解题 题目名称:计时挑战,你能当人肉计时器么? 题目下载地址:https://pan.baidu.com/s/11BcKF6LTWQ ...
- 大学生HTML5竞赛网站,2019全国大学生信息安全竞赛Web Writeup
这次web题真切得让我感受到了我得辣鸡 顿时被打了鸡血 最后只做出来一题,但是有两道题都是马上要出来了最后时间不够 ,这里总结一下 web1 JustSoso 打开之后是这样得 右键查看源码 提示需要 ...
- 国赛mysql加固_2019 全国大学生信息安全竞赛创新能力实践赛3道Web Writeup
0x01 JustSoso 本题的主要知识点在于反序列化的应用和parse_url()函数的解析问题,首先通过网页源码中的文件读取提示读取得到index.php文件源码和hint文件源码,任意文件读取 ...
- 第十四届全国大学生信息安全竞赛-线上赛Writeup
文章目录 场景实操开场卷 WEB easy_sql easy_source MISC tiny traffic running_pixel 场景实操二阶卷 WEB middle_source MISC ...
- 2019全国大学生信息安全竞赛初赛writeup
part_des 题目描述 Round n part_encode-> 0x92d915250119e12b Key map -> 0xe0be661032d5f0b676f82095e4 ...
最新文章
- 禁毒学、油画、乌尔都语……字节跳动程序员的专业有多奇特丨技术同学大数据报告...
- symfony的安装方法
- IIS 权限错误(401.1 401.2 401.3)解决办法
- vue项目创建步骤 和 路由router知识点
- 西门子宣布美国充电桩扩产计划
- 职场奇袭!3分钟完成一天工作
- 购物搜索引擎架构的变与不变
- 实现滑动到中间变大的效果
- 2ASK调制解调实验
- 读书笔记之《Redis开发与运维》—— 一
- 利用canvas制作乱跑的小球
- 纺织服装外贸行业解决方案丨汇信外贸软件
- 虚拟机dns服务器不可以,windows虚拟机中DNS服务配置
- VC++计算正反坐标方向角
- 小说作者推荐:焦糖冬瓜合集
- 快排及其优化(C语言)
- 虚拟机VMware中Linux联网
- Cent OS 7.7 搭建蓝鲸智云社区版5.1.27(2)——标准部署
- git的一些基本命令总结
- android 设备驱动 位置,android中各个部件驱动在源码中的位置