SimpleRev学习
1.查壳
无壳,获取到信息64位,而且AMD x86-64
后面的信息平时没怎么关注,但是在这题里面有着关键指向作用
X86平台属于小端序,ARM平台属于大端序
涉及到字符串的储存问题
2.审题
题目很简单,分析清楚之后爆破就行(%的逆我暂时不清楚如何实现)
unsigned __int64 Decry()
{
char v1; // [rsp+Fh] [rbp-51h]
int v2; // [rsp+10h] [rbp-50h]
int v3; // [rsp+14h] [rbp-4Ch]
int i; // [rsp+18h] [rbp-48h]
int v5; // [rsp+1Ch] [rbp-44h]
char src[8]; // [rsp+20h] [rbp-40h]
__int64 v7; // [rsp+28h] [rbp-38h]
int v8; // [rsp+30h] [rbp-30h]
__int64 v9; // [rsp+40h] [rbp-20h]
__int64 v10; // [rsp+48h] [rbp-18h]
int v11; // [rsp+50h] [rbp-10h]
unsigned __int64 v12; // [rsp+58h] [rbp-8h]
v12 = __readfsqword(0x28u);
*(_QWORD *)src = 357761762382LL; //转化之后为 *(_QWORD *)src = 'SLCDN';
v7 = 0LL;
v8 = 0;
v9 = 512969957736LL; //转化之后为 v9 = 'wodah';
v10 = 0LL;
v11 = 0;
text = (char *)join(key3, &v9); //拼接函数 key3='kills' key3='kills'+v9
strcpy(key, key1); //key1='ADSFK'
strcat(key, src); //拼接 key='ADSFK'+scr
v2 = 0;
v3 = 0;
getchar();
v5 = strlen(key);
for ( i = 0; i < v5; ++i )
{
if ( key[v3 % v5] > 64 && key[v3 % v5] <= 90 )//大写转小写
key[i] = key[v3 % v5] + 32;
++v3;
}
printf("Please input your flag:", src);
while ( 1 )
{
v1 = getchar(); //读取字符
if ( v1 == 10 ) //读到回车结束
break;
if ( v1 == 32 )
{
++v2;
}
else
{
if ( v1 <= 96 || v1 > 122 )//非小写进入
{
if ( v1 > 64 && v1 <= 90 )//大写进入
str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;
}
else//小写进入
{
str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;
}
if ( !(v3 % v5) )
putchar(32);
++v2;
}
}
if ( !strcmp(text, str2) )//比较
puts("Congratulation!\n");
else
puts("Try again!\n");
return __readfsqword(0x28u) ^ v12;
}
就是一条核心算法,较为简单
str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;
但是重要的点在于字符串的储存方式(大小端
3.大小端储存
大端(存储)模式:是指一个数据的低位字节序的内容放在高地址处,高位字节序存的内容放在低地址处。
小端(存储)模式:是指一个数据的低位字节序内容存放在低地址处,高位字节序的内容存放在高地址处。(可以总结为“小小小”即低位、低地址、小端)
在计算机系统中,我们是以字节为单位存放数据的,每个地址单元都对应着一个字节,一个字节为8bit。但在C语言中存在不同的数据类型,占用的字节数也各不相同,那么就存在怎样存放多个字节的问题,因此就出现了大端存储模式和小端存储模式。
高低地址
C程序映射中内存的空间布局大致如下:
|最高内存地址 0xFFFFFFFF
|栈区(从高内存地址,往 低内存地址发展。即栈底在高地址,栈顶在低地址)
|堆区(从低内存地址 ,往 高内存地址发展。即栈底在低地址,栈顶在高地址)
|全局区(常量和全局变量)
|代码区
|最低内存地址 0x00000000
高低字节
在十进制中靠左边的是高位,靠右边的是低位,在其他进制也是如此。例如 0x12345678,从高位到低位的字节依次是0x12、0x34、0x56和0x78。
网络字节序 就是 大端字节序:4个字节的32 bit值以下面的次序传输,首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit
主机字节序 就是 小端字节序,现代PC大多采用小端字节序。
对于数据 0x12345678,假设从地址0x4000开始存放,在大端和小端模式下,存放的位置分别为:
| 内存地址 | 小端储存 | 大端储存 |
|---|---|---|
| 0x4003 | 0x12 | 0x78 |
| 0x4002 | 0x34 | 0x56 |
| 0x4001 | 0x56 | 0x34 |
| 0x4000 | 0x78 | 0x12 |
小端存储后:0x78563412 大端存储后:0x12345678
4.解题
由于我们查到 AMD x86-64 这个信息,并且查到是小端序,那我们上面的字符串就要逆着读
key3='kills'+v9=killshadow
key='ADSFK'+scr=ADSFKNDCLS
#include <stdio.h>
#include <string.h>
int main()
{
int i=0;int c=0;
char a[11]="killshadow";
char b[11]="adsfkndcls";
for(i=0;i<10;i++){
for(c=32;c<127;c++){
if((c-39-b[i]+97)%26+97==a[i]){
if((c>=65&&c<=90)||(c>=97&&c<=122)){
printf("%c",c);break;
}
}
}
}
return 0;
}
得出flag;
参考博客:
https://blog.csdn.net/sifanchao/article/details/79999219
https://blog.csdn.net/sunflower_della/article/details/90439935
SimpleRev学习的更多相关文章
- 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代
2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Unity3d学习 制作地形
这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
- 菜鸟Python学习笔记第一天:关于一些函数库的使用
2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
随机推荐
- pdfFactory如何设置限制打印和浏览文档权限
当我们进行私密文件的分享时,除了要设置密码保护文件内容外,还要注意设置打印限制,防止他人利用打印的方式,进行纸质文件的传播. 在使用pdfFactory安全策略时,我们可以通过设定禁止打印的方式,完全 ...
- 吉他弹唱上手——使用节奏变化弹好chord谱
本篇文章将向大家介绍如何改造来自网上的chord谱. 在各位日常的弹唱之中,应该会常常遇到朋友点歌的情况,如果点唱的这首歌我们听过,那我们尚可以靠以往的记忆来应付.如果这首歌我们只是曾经听到过听过,而 ...
- Guitar Pro吉他指弹入门——双手泛音
曾经有一段时间在琴行里经常遇到有人来试琴,很多人试弹得曲子就是郑成河的<Flaming>,直译过来就是热情的意思.这首曲子里面有很多泛音存在,吉他泛音类似于钟鸣或者摇铃的声音,是一种令人耳 ...
- web自动化测试难点 滚动条操作、日期框处理、上传文件
如何把页面滑到最低部? 一般来说,做web自动化测试时,不需要单独写代码,把页面滑到可见,因为click操作,只要是元素存在并且加载出来了,就可以点击到,无需另外写滑动元素的代码. 如果特殊情况需要滑 ...
- CentOS7.X 下安装MySQL8.0(附文件)
这是64位的安装包.如果需要32位的可以去官网下载哦.步骤一样 1 获取安装资源包 mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar 链接: https://pan.b ...
- IPv6 Rapid Deployment, IPv6 6rd初探
IPv6 Rapid Deployment: Provide IPv6 Access to Customers over an IPv4-Only Network 原文地址:https://www.c ...
- 给你的C/C++学习路线建议
因为程序员的高工资,吸引了大部人学习编程,但是通过书籍和视频来学习,总是别人推荐一点是一点,那么如何才能系统有效的学习呢?今天就为你来介绍~ C语言是所有学习编程的人都应该首要学习的语言,今天就C语言 ...
- lambda表达式中无法抛出受检异常!
抛出受检异常的时候,我们的接口应该带上throw关键字,但通过lambda表达式实现的Consumer的accept方法并不带有关键字,因此在lambda表达式中不能抛出受检异常必须把它吃掉
- mq消息
同步,异步,单向 Message的扩展属性主要包含下面几个: tag:消息tag,用于消息过滤 keys:Message索引键,用多个空格隔开,可以根据这些key快速检索到消息 waitStoreMs ...
- flink:StreamExecutionEnvironment、DataStream和Transformation与StreamOperator
1.StreamExecutionEnvironment: StreamExecutionEnvironment是构建执行任务环境以及任务的启动的入口,主要具备以下几方面的职责: a.存储全局相关的参 ...