如何解决求解按位与方程
如何从以下位置找到变量 local_18:
((int)(char)local_18 & 0x1fffffffU) == 0x30)
我认为它可能是联想的:
((int)(char)local_18 & 0x1fffffffU) & 0x1fffffffU == 0x30 & 0x1fffffffU)
但是 0x1fffffffU & 0x1fffffffU
不会抵消。
以下是变量的类型(以及我正在尝试解决的整个系统):
int difficult_part(void)
{
int iVar1;
size_t sVar2;
byte local_28;
byte local_27;
byte local_26;
byte local_25;
byte local_24;
byte local_23;
byte local_22;
char local_21;
byte local_18;
byte local_17;
byte local_16;
byte local_15;
byte local_14;
byte local_13;
byte local_12;
char local_11;
puts("guess the first eight characters.");
fgets((char *)&local_18,0x10,stdin);
sVar2 = strlen((char *)&local_18);
if (sVar2 == 9) {
if (((((local_18 == 0x65) && (local_17 == 0x37)) && (local_16 == 0x35)) && // That's pretty easy
((local_15 == 0x35 && (local_14 == 0x32)))) && // That's pretty easy
((local_13 == 99 && ((local_12 == 0x66 && (local_11 == '6')))))) { // That's pretty easy
puts("Well done,you can try to guess the next eight characters but it won\'t be so easy.");
fgets((char *)&local_18,stdin);
sVar2 = strlen((char *)&local_18);
if (sVar2 == 9) {
if ((((((int)(char)local_18 & 0x7fffffffU) == 0x34) && // Here is where I'm stuck
(((int)(char)local_17 & 0x7fffffffU) == 99)) && // Here is where I'm stuck
(((int)(char)local_16 & 0x7fffffffU) == 0x65)) && // Here is where I'm stuck
(((((int)(char)local_15 & 0x7fffffffU) == 0x32 && // Here is where I'm stuck
(((int)(char)local_14 & 0x7fffffffU) == 0x65)) && // Here is where I'm stuck
((((int)(char)local_13 & 0x7fffffffU) == 0x35 && // Here is where I'm stuck
((((int)(char)local_12 & 0x7fffffffU) == 0x61 && (((int)local_11 & 0x7fffffffU) == 100) // Here is where I'm stuck
))))))) {
puts("I see you\'ve got some skills in reversing,but can you guess the next eight ?");
fgets((char *)&local_18,stdin);
sVar2 = strlen((char *)&local_18);
if (sVar2 == 9) {
if ((((((int)(char)local_18 & 0x1fffffffU) == 0x30) &&
(((int)(char)local_17 & 0x1fffffffU) == 0x62)) &&
(((int)(char)local_16 & 0x1fffffffU) == 0x62)) &&
(((((int)(char)local_15 & 0x1fffffffU) == 0x30 &&
(((int)(char)local_14 & 0x1fffffffU) == 0x39)) &&
((((int)(char)local_13 & 0x1fffffffU) == 0x35 &&
((((int)(char)local_12 & 0x1fffffffU) == 0x34 &&
(((int)local_11 & 0x1fffffffU) == 0x66)))))))) {
puts(
"I must say that I\'m impressed but it\'s not over. Will you be able to guess the next eight characters ?"
);
fgets((char *)&local_28,stdin);
sVar2 = strlen((char *)&local_28);
if (sVar2 == 9) {
if ((((((local_28 ^ local_18) == 1) && ((local_27 ^ local_17) == 0x54)) &&
((local_26 ^ local_16) == 0x55)) &&
(((local_25 ^ local_15) == 0x51 && ((local_24 ^ local_14) == 9)))) &&
(((local_23 ^ local_13) == 7 &&
(((local_22 ^ local_12) == 0x57 && (local_11 == local_21)))))) {
puts("You're done !");
most_difficult_part();
iVar1 = 0;
}
else {
iVar1 = puts("Wrong guess");
}
}
else {
iVar1 = puts("Well it seems that someone has trouble counting to eight.");
}
}
else {
iVar1 = puts("Wrong guess.");
}
}
else {
iVar1 = puts("Well it seems that someone has trouble counting to eight.");
}
}
else {
iVar1 = puts("Wrong guess.");
}
}
else {
iVar1 = puts("Well it seems that someone has trouble counting to eight.");
}
}
else {
iVar1 = puts("Wrong guess.");
}
}
else {
iVar1 = puts("Well it seems that someone has trouble counting to eight.");
}
return iVar1;
}
解决方法
您的示例使用位掩码。您可以使用它来忽略某些选定的位。在您的示例中,您有:
local_18 & 0x1fffffffU
其中 0x1fffffffU
是您的位掩码。如果你用二进制表示这个数字,你会得到 0b00011111111111111111111111111111U
,三个 0
后跟 29 个 1
。
这等于“忽略 local_18
的前三个二进制值并将其余的与 0x30
进行比较”。
如果 local_18
的最后 27 个二进制数字等于 0x30
,则您的等式为真。
你可能想谷歌位掩码,那里有很多很好的教程和解释。
一些例子
local_18 = 0x30 -> true
local_18 = 0x31 -> false
local_18 = 0x80000030 -> true
local_18 = 0x40000030 -> true
local_18 = 0x80001030 -> false
测试代码:
int main()
{
int local_18 = 0x30;
if ((local_18 & 0x1fffffffU) == 0x30)
std::cout << "true";
else
std::cout << "false";
return 0;
}
更新
在我看到你的代码后,有一些变化。您正在为 byte
使用类型 local_18
,因此掩码非常无用。您有一个字节,将其转换为 int(通过在变量前添加 0 来完成),因此除最后一个字节之外的所有内容都是零。
这意味着在你的情况下,方程可以简化为
local_18 == 0x30
您可以使用我的示例代码轻松验证。只需在 (char)
中添加 if
转换,将 int 修剪为一个字节:
int main()
{
int local_18 = 0x30;
if (((char)local_18 & 0x1fffffffU) == 0x30)
std::cout << "true";
else
std::cout << "false";
return 0;
}
给出以下内容:
local_18 = 0x30 -> true
local_18 = 0x31 -> false
local_18 = 0x130 -> true,the cast trims the int to one byte,so the 1 will be ignored
local_18 = 0x80000030 -> true
local_18 = 0x40000030 -> true
local_18 = 0x80001030 -> true
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。