攻防世界 reverse新手题 logmein
程序员文章站
2024-03-11 22:11:13
...
logmein
下载文件,改为exe后缀,查看一下,ELF文件,64位
64位ida打开,找到main函数,F5查看伪代码
v9 = 0;
strcpy(v8, ":\"AL_RT^L*.?+6/46");
v7 = 'ebmarah';
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", s);
v3 = strlen(s);
if ( v3 < strlen(v8) )
sub_4007C0();
for ( i = 0; i < strlen(s); ++i )
{
if ( i >= strlen(v8) )
sub_4007C0();
if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) )
sub_4007C0();
}
sub_4007F0();
}
sub_4007F0()的地址都是输出Incorrect password!
所以从条件中找flag
if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) )
sub_4007C0();
说明正确的应该是s[i] = (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i])
转换位Python
a = ":\"AL_RT^L*.?+6/46"
b = "harambe"
c = 7
flag = ''
for i in range(0,len(a)):
flag += chr(ord(b[i%c]) ^ord(a[i]))
print(flag)
第一个if,大于v8的长度错误
第二个if,小于等于错误,所以字符串长度flag=v8
b=harambe是因为小端储存,所以翻转
小端储存:即最低地址存放的最低字节,一个用十六进制表示的32位数据:12345678H,存放在存储字长是32位的存储单元中,按低字节到高字节的存储顺序为0x78、0x56、0x34和0x12。整个存储字从低字节到高字节读出的结果就是:78563412H,为Intel x86 系列等采用
程序运行结果:
RC3-2016-XORISGUD