攻防世界 CTF RE 新手区 logmein 题解
新人第一次在52pojie上发帖子,如有问题,请各位海涵。这个题目本来不应该会很难的,主要是这个题目用 ida 转伪代码的时候,伪代码过于奇葩,导致题目卡在了最后一步。
不说了上题解。
我们首先将程序丢进ida,然后找到main函数后按住F5翻译成伪代码。然后得到了这个代码。
> 为了方便阅读,部分代码的变量被我重新命名过
```cpp
void __fastcall __noreturn main(__int64 a1, char **a2, char **a3)
{
size_t len; // rsi
int i; //
char input; //
int v6; //
__int64 v7; //
char target; //
int v9; //
v9 = 0;
strcpy(target, ":\"AL_RT^L*.?+6/46");
v7 = 28537194573619560LL;
v6 = 7;
printf("Welcome to the RC3 secure password guesser.\n", a2, a3);
printf("To continue, you must enter the correct password.\n");
printf("Enter your guess: ");
__isoc99_scanf("%32s", input);
len = strlen(input);
if ( len < strlen(target) )
sub_4007C0();
for ( i = 0; i < strlen(input); ++i )
{
if ( i >= strlen(target) )
sub_4007C0(); // 输出错误提示
if ( input != (char)(*((_BYTE *)&v7 + i % v6) ^ target) )// v6就是7
sub_4007C0(); // 输出错误提示
}
sub_4007F0(); // 输出正确提示
}
```
这个伪代码貌似也没啥,主要是最后判断密码正确性的时候,出现的这个表达式是啥:
```cpp
(char)(*((_BYTE *)&v7 + i % v6) ^ target)
```
首先 v7 估计是一个`long long`类型的变量,那么在这个表达式中,最诡异的是`*((_BYTE *)&v7 + i % v6)`这部分。我们猜测(_BYTE *)估计是将这个v7的地址转换为某个1字节类型的变量的指针,可以等价看成是`(char *)`。所以,很显然这个地方是将v7所存储的数据看成字符数组。
由于在内存中存储一个整数数据,数据的高位存在地址更大的内存处,所以v7在内存中的存储结构是这样的
> v7 的 16 进制为 65626d61726168
!(https://i.loli.net/2021/01/16/JwzTWYkKRVqhn59.png)
所以最后在这个表达式中,v7等价于这样的数组:
```cpp
char v7[] = {0x68, 0x61, 0x72, 0x61, 0x6d, 0x62, 0x65};
```
刚好数组大小为7个1字节变量,和 v6 的值吻合。到这里就差不多了,应该能看懂剩下的东西了。 我也是新手 已入学习 萌新观望 非常好的分析,支持分享 加油,你们这也太厉害了 谢谢分享{:1_921:} 强啊,我至今只会wp。。。
酩酊剑舞 发表于 2021-1-21 15:24
强啊,我至今只会wp。。。
WP是什么东西? 虽然看不懂,但还是留个言支持下分享!
页:
[1]