7.26 二进制练习题
程序员文章站
2024-03-05 14:26:06
...
给你个礼物你能收到吗?
打开这个exe文件后,我们看到了它让我们输入礼物提取码,我们先随便输入数据,按回车显示提取码错误还有输错的次数,我们发现这里存在着一个循环。
然后我们在IDA里面打开这个文件
int __cdecl main(int argc, const char **argv, const char **envp)
{
_main();
present();
heart();
system("pause");#当没这个语句或类似语句,你点开生成的.exe文件,运行界面只会闪一下,而有这个语句,就不会了!类似语句还有getchar();在最后加上这种语句,你就可以看到运行结果了!
return 0;
}
首先我们看到了一个这样的程序,我们先分析这个程序,我们先点开present()这个函数,看到了如下的程序,我们先分析这个程序。
oid __cdecl present()
{
__int64 v0; // rax
std::ostream *v1; // rax
unsigned int x; // [rsp+24h] [rbp-5Ch]
int xa; // [rsp+24h] [rbp-5Ch]
int xb; // [rsp+24h] [rbp-5Ch]
int xc; // [rsp+24h] [rbp-5Ch]
int xd; // [rsp+24h] [rbp-5Ch]
int xe; // [rsp+24h] [rbp-5Ch]
int xf; // [rsp+24h] [rbp-5Ch]
int n; // [rsp+28h] [rbp-58h]
int y; // [rsp+2Ch] [rbp-54h]
std::operator<<<std::char_traits<char>>((std::ostream *)&std::cout, asc_47F000);
std::operator<<<std::char_traits<char>>((std::ostream *)&std::cout, &byte_47F050);
x = 0;
y = 2027091370;
std::istream::operator>>(&std::cin, &n);#表示输入提取码
while ( n != y )
{
if ( n == 5201314 )
{
std::operator<<<std::char_traits<char>>((std::ostream *)&std::cout, &byte_47F068);
system("pause");
exit(0);
}
if ( !(y % 40) )
y = 2027091370;
v0 = std::operator<<<std::char_traits<char>>((std::ostream *)&std::cout, &byte_47F0A0);
v1 = (std::ostream *)std::ostream::operator<<(v0, x);
std::operator<<<std::char_traits<char>>(v1, &byte_47F0C3);
std::istream::operator>>(&std::cin, &n);
++x;
y += 7;
}
std::operator<<<std::char_traits<char>>((std::ostream *)&std::cout, &byte_47F0D8);
for ( xa = 0; xa <= 78; ++xa )
{
std::operator<<<std::char_traits<char>>((std::ostream *)&std::cout, "[");
if ( xa <= 19 )
Sleep(0xC8u);
while ( n != y )
首先这里与一个while循环,我们得知如果我们输入的提取码n不等于 y = 2027091370,程序就往下执行 {
if ( n == 5201314 )
{
std::operator<<<std::char_traits<char>>((std::ostream *)&std::cout, &byte_47F068);
system("pause");
exit(0);
}
如果我们输入的n=5201314,就会跳出这个程序。
“`
对这整段代码分析,我们知道这就是上面我们判断的那个循环,当我们输入的提取码错误的时候,它就会说“提取码错误,滚去重输,你已经输入了…次”,所以v0输出的应该是这段文字,这时并没有提取成功,y+=7循环运行后,y值改变,我们继续这个循环,如果if条件成立(即y%40=0),也会输出v0,所以要想提取成功,就要跳出这个循环,令n等于y。
所以我们可以在开始的时候就输入提取码,使其值为2027091370,得到如下