这个半分解代码做了什么(C)

时间:2016-03-10 22:44:49

标签: c assembly binaryfiles

我已将一个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);。我明白这会把那个地址的价值转化为某种东西,但我不确定是什么。

1 个答案:

答案 0 :(得分:2)

显然,0x80498ec是一个指向char的指针数组,如

char *msg [] = {"One", "two", "three", "four", "five"};

v2 是此指针数组的索引。

该行最初可能已阅读

if (strcmp (str, msg[v2]) != 0)
   bomb ();