**

逆向reverse小白一枚,欢迎各位师傅指出不足之处。

buuctf-SimpleRev

**

考点:大端序,小端序,分析伪代码

做这道题的时候遇到了一个新的知识点,大端序和小端序。

用Exeinfo PE打开

发现是64位的,无壳。然后用IDA pro64位打开

shift + F12 查看字符串窗口



ctrl + X 交叉引用


F5反汇编。

将100、68、113、83,R字符转换为ASCLL码。

看到有一个Decry()函数。
打开之后,代码如下:

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;
v7 = 0LL;
v8 = 0;
v9 = 512969957736LL;
v10 = 0LL;
v11 = 0;
text = (char *)join(key3, &v9);
strcpy(key, key1);
strcat(key, src);
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;
}

将src 和 v9 的数据转为十六进制,快捷键H。

可以看到这里的两个十六进制是大端序,但是数据在内存中都是小端序,所以要将其,反转一下。一般在CPU,x86都是小端序,但是IDA将之转换为了大端序。

先快捷键R 将其转为字符。再反转,所以src = NDCLS , v9 = hadow 。

key3已经告诉,key3 = kills 。
再看这有一个join函数,它的作用是以指定的字符连接成一个新的字符串。此处是将key3 和 v9 连接成一个新的字符串。

即text = killshadow。

strcpy(key, key1); //复制函数,将key1的字符串复制给key,

key1 = ADSFK, 所以key = ADSFK
strcat函数,是将key 和 src 拼接在一起的函数, 所以key = ADSFKNDCLS。

看到v5 = strlen(key),strlen是计算字符串的长度,所以v5 = 10 。
再看这个for循环语句,先将64,90变为字符。为

再对照ASCLL码表,

如果key3【v3 % v5】是大写字母,则把它变为小写字母。大小写字母的ASCLL码,相差32。

再将下面的数字变为ASCLL码字符。

看到最下面的if语句,如果!strcmp(text ,str2),则正确,strcmp函数,是比较函数,如果两个字符串相同,则等于0,所以text = str2才成功。

而得到str2的关键就是:
str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;

接下来,写脚本。

#include<stdio.h>
int main()
{
char key[] = “adsfkndcls”; //key字符串是adsfkndcls
char text[] = “killshadow”; //text字符串是killshadow
int i; //定义了变量 i
int v2 = 0;
int v3 = 10;//v3的长度为10 ,因为在大写字母变小写的时候,v3会++,而字符串变了10次。
int v5 = 10;
for (int i = 0; i < v5; i++)//开始循环
{
for (int j = 0; j < 123; j++)//开始第二重循环 j = v1;
{
if ((j < ‘A’ || j > ‘Z’) || (j < ‘z’ && j > ‘a’))//|| 和 && 交换 > 和 < 交换 ,让j不再那个范围之内
{
continue;//如果不在范围之内,就跳过本次循环。
}
if ((j - 39 - key[v3 % 10] + 97) % 26 + 97 == text[i])//执行这个算法,跟text字符串相比,如果相等就输出
//这个字符
{
printf("%c",j);
v3++;//注意算法里面 v3++,所以这里也要把v3++;
break;
}
}
}
}

总结:这个题目除了基本的IDA pro的一些小小的快捷键之外,还需要知道小端序和大端序的知识,怎么去判断是小端序和大端序,这个我也不知道(百度了一波,可以自己写一个小程序来判断),大概就是在做题的时候,如果碰到我们需要手动去转字符的,应该就是反转一下字符的位置,实在不行大端序和小端序都去试一下。然后并是分析伪代码,知道它是在干什么,我们需要什么,还差了什么。然后写脚本,来运行得出flag。目前这一点,自己还不是很会,还需多多练习啊。

继续学习!!!

BUUCTF SimpleRev(涉及大小端序存储的问题)相关推荐

  1. C语言-MSB/LSB大小端序

    一.MSB和LSB 首先我们要理解什么是MSB和LSB.数据在计算机里面都是二进制存储的,二进制的最高位为MSB,最低位是LSB. MSB:Most Significant Bit(最高有效位),也就 ...

  2. Linux一句命令之判断大小端序

    笔者在开发Linux应用程序时,由于判断大小端序的问题,使用的方法是用C语言判断,方法是可以判断得到系统是什么端序,但是太麻烦了.笔者是比较懒的人,不想写那么多代码,想一句命令就解决端序判断的问题. ...

  3. 数据在内存中的大小端模式存储

    大端模式:数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中. 小端模式:数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中. 因为在计算机系统中,我们是以字节为单 ...

  4. buuctf simplerev 中的小头位序

    (33条消息) BUUCTF SimpleRev(涉及大小端序存储的问题)_Ireb9z的博客-CSDN博客_buuctfsimplerevhttps://blog.csdn.net/afanzcf/ ...

  5. 什么是字节序(端序、低端字节序、高端字节序、网络字节序)

    前言 一个内容为12(字符串)的文本文件,它的第一个字节是什么(小端序)?如果你的回答是0x32,那你真的应该好好理解下字节序了.如下图所示,我这里的正确答案是0x31.当然如果你的回答是不一定,这似 ...

  6. 什么是大端序和小端序,为什么要有字节序

    什么是字节序 字节序,又称端序或尾序(英语中用单词:Endianness 表示),在计算机领域中,指电脑内存中或在数字通信链路中,占用多个字节的数据的字节排列顺序. 在几乎所有的平台上,多字节对象都被 ...

  7. IP地址转换、主机大小端、htonl、ntohl实现

    http://blog.csdn.net/zww0815/article/details/7592940 #include <IOSTREAM> //#include <WINSOC ...

  8. java大小端转换工具类

    最近的项目频繁涉及大小端转换的情况,参考github(https://github.com/Frank-Wiebeler/java-Big2LittleEndian/blob/master/src/c ...

  9. 编写程序判断大小端的两种方法

    大小端这个问题在面试过程中偶尔会被问到,这里笔者总结了一下,提出了两个小程序进行判断,欢迎大伙 查看指教 第一种:联合(union)方式判断法 在union中所有的数据成员共用一个空间,同一时间只能储 ...

最新文章

  1. Android中SQLite的使用
  2. php将科学计算法得出的结果转换成原始数据
  3. wcf http 返回图片
  4. 从工作经历和实践理论看工业互联网的发展
  5. 用 JavaScript 的方式理解递归
  6. Java 并发编程 基础
  7. [Java] 蓝桥杯ADV-193 算法提高 盾神与条状项链
  8. 伊诺ET-33夹式校(音器吉他/贝司/小提琴/尤克里里 使用
  9. 3dsmax导出html,3dsmax导出模型(怎么把3DMax文件导出CAD图纸?)
  10. Android通讯录管理遇到的权限问题
  11. android canvas添加文字居中,android Canvas drawText 文字居中
  12. 如何用Jmeter发送消息到Solace JNDI
  13. 购买阿里云GPU虚拟化型实例规格族vgn6i抢占式实例并搭建CUDA 11.5和cuDNN 8.3.0
  14. CCF CSP认证——201312
  15. aria2Linux开机启动,Ubuntu安装aira2及开机启动配置
  16. 如何在opengl用代码绘制英文_如何用Python画一只肥肥的柯基狗狗——turtle库绘制椭圆与弧线实践...
  17. [家里蹲大学数学杂志]第297期丘成桐大学生数学竞赛2014年分析与方程个人赛试题...
  18. gmsv源代码c语言,一个变态网站取源码问题
  19. 产品管理——怎样做产品规划
  20. 参考 2.4.20 2.6.X

热门文章

  1. 超强破解Word“取消文档保护”密码
  2. 主控是sm2259xt,求量产工具,固态硬盘是七彩虹sl500 250G的
  3. 【Spark2运算效率】第四节 影响生产集群运算效率的原因之数据倾斜
  4. 120个ps常用的好看的英文艺术字体下载分享
  5. java夯实基础-基本数据类型
  6. UltimateDefrag磁盘碎片整理软件 v3.0.100.19汉化版
  7. 国内链改思路是什么?
  8. 初学者如何查阅自然语言处理(NLP)领域学术会议
  9. Interpretability Beyond Feature Attribution: Quantitative Testing with Concept Activation Vectors
  10. 网络营销实战课-微信实操