上山砍大树 发表于 2019-11-14 16:09

攻防世界 reverse 的logmein writeup

图显示不出来吗。
分析如上图:
if ( v3 < strlen(v8) )
    quit();
这里可以判定输入字符串长度>=strlen(v8);
if ( i >= strlen(v8) )
      quit();
这样的话就可以最终确定:strlen(input_string)==strlen(v8),确定了input_string的长度为17。

既然 input_string != (char)(*((_BYTE *)&v7 + i % v6) ^ v8)
就判断是错误,说明每一个输入的字符都需要跟后面算出来的结果相比对,对比成功才能得到
printf("You entered the correct password!\nGreat job!\n");。

所以想要得到正确的输入,通过对比的内容(像面镜子)就可以得到了。
那我们就看看这个对比度内容是什么:
(char)(*((_BYTE *)&v7 + i % v6) ^ v8)
咱们先看看里面的参数:

[*]v6=7;
[*]v8=“:\"AL_RT^L*.?+6/46”;
[*]v7
咱们一起来看看v7:类型是_int64,v7保存的数据是28537194573619560LL,证明这是一个long long int类型的数据。
int64的64可能是因为一个long long int数据占8byte=64bit的长度。(测算方法: printf("\n\n%d",sizeof(long long int));
//输出结果为8,即8byte)
但是上面需要的是char类型的(&v7+偏移量)来确定字符,并不需要int类型的数据,那么这是怎么回事呢?看下面的分析:
(*byte)==>(char *)类似于强制类型转换,&v7也就是将保存v7数据的地址提出,然后(_BYTE *)&v7可以用另一种更简单的方式理解:
   char *target=(char *)&v7;就是定义一个指针指向v7的首地址。
这样(指针+数字)的组合就是数组的索引方式,所以&v7+i==&v7(这部分是指针方面的知识)。
那么v7由int64转化到char类型后,(&v7+数字偏移量)索引到的应该是什么呢?这就不得不提到了数据在内存中存储的方式了:
long long int v7=28537194573619560,但是v7在内存中是以字节为单位存储的,把v7转化为16进制为:0x65626D61726168;
在内存中存储的方式是小端存储(little-endian),如图:

好像又没图了,不过我还能讲。接下来就是强制转化为字符形式,然后访问内部成员,数组需要从(首地址(即低地址)+偏移)来索引数据,所以索引出的(char *)v7="harambe";
明白了上面的指针和强制类型转化,小端序存储后,input_string = (char)(*((_BYTE *)&v7 + i % v6) ^ v8)就很容易掌握了算法了,然后我们直接用c写两个程序把input_string字符串整理出来:
#include <stdio.h>
#include <string.h>

int main()
{
    char v8[]=":\"AL_RT^L*.?+6/46";//strlen(v8)==strlen(input_string)
    long long int v7=0x65626D61726168;

    int i;
    /*将long long int转化为字符类型
注意理解小端序存储方式和指针索引数据*/
    char *target=(char *)&v7;

    char final_string;
    for(i=0;i<strlen(v8);i++)
    {
      final_string=target^v8;
      printf("%c",final_string);
    }
    return 0;

}


这样就可以得到flag为RC3-2016-XORISGUD;

当然也可以这样做:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    long long int v7=0x65626D61726168;
    char a[]=":\"AL_RT^L*.?+6/46";
    char input_string;

    for(int i=0;i<strlen(a);i++)
    {
      input_string=(char)(*((char *)&v7 + i%7)^a);
      printf("%c",input_string);
    }
    printf("\n\n%d",sizeof(long long int));
    return 0;
}


可以对比一下,哪些是可以相互替代的,更容易加深对指针和数组关系的理解。

Hmily 发表于 2019-11-14 16:56

https://www.52pojie.cn/misc.php?mod=faq&action=faq&id=29&messageid=36 看这个学习下贴图。

上山砍大树 发表于 2019-11-14 17:20

Hmily 发表于 2019-11-14 16:56
https://www.52pojie.cn/misc.php?mod=faq&action=faq&id=29&messageid=36 看这个学习下贴图。

ok我看看修改一下

哲别冰 发表于 2019-11-14 19:59

不明觉厉{:1_924:}

kao2288 发表于 2019-11-14 23:14

下载一个看看

Shiroi14 发表于 2019-11-15 00:50


不明觉厉

aj2002214 发表于 2019-11-15 11:21

下载一个看看

ctf513 发表于 2019-11-15 14:00

前来学习!!!!!!

2Burhero 发表于 2019-11-15 15:20

暖贴小能手

避世狗熊 发表于 2019-11-15 15:30

不明觉厉,修改试试
页: [1] 2
查看完整版本: 攻防世界 reverse 的logmein writeup