我已将一个objdumped文件转换为ad-hoc C代码,并且我试图找出它的作用。特别是,我坚持一次。我先给出较大的部分,然后是我坚持的部分。
更大的代码部分:
while (true) {
bool v3 = v2 == 5 | v2 < 5 ^ (4 - v2 & v2) < 0; // 0x8048600
// branch -> 0x80485a7
while (true) {
// 0x80485a7
if ((int32_t)file == g1) {
// 0x80485af
printf("guess %d (of 5)? ", v2);
// branch -> 0x80485bf
}
// 0x80485bf
int32_t str2;
char * str = fgets((char *)&str2, 512, file); // 0x80485d2
if (str == NULL) {
// 0x80485fd
if (!v3) {
// break -> 0x8048602
break;
}
// continue -> 0x80485a7
continue;
} else {
int32_t str3 = *(int32_t *)(4 * v2 + 0x80498ec); // 0x80485db
if (strcmp(str, (char *)str3) != 0) {
// 0x80485ee
bomb();
// branch -> 0x80485f3
}
int32_t v4 = v2 + 1; // 0x80485f3
if (v4 >= 6) {
// break (via goto) -> 0x8048602
goto lab_0x8048602;
}
v2 = v4;
// continue (via goto) -> 0x80485a7
goto lab_0x80485a7;
}
// 0x8048602
success();
return 0;
}
lab_0x8048602:
// 0x8048602
success();
return 0;
}
特别给我带来麻烦的部分:
int32_t str3 = *(int32_t *)(4 * v2 + 0x80498ec); // 0x80485db
if (strcmp(str, (char *)str3) != 0) {
// 0x80485ee
bomb();
// branch -> 0x80485f3
}
我知道strcmp返回1,0,-1,但这个语句到底测试的是什么?我不完全确定str3的值是什么:*(int32_t *)(4 * v2 + 0x80498ec);
。我明白这会把那个地址的价值转化为某种东西,但我不确定是什么。
答案 0 :(得分:2)
显然,0x80498ec是一个指向char的指针数组,如
char *msg [] = {"One", "two", "three", "four", "five"};
和 v2 是此指针数组的索引。
该行最初可能已阅读
if (strcmp (str, msg[v2]) != 0)
bomb ();