更改代码流

时间:2017-04-08 05:08:46

标签: c

我正在尝试更改此程序的流程。我想让它调用win函数。这不是确切的代码,但这将解释代码的作用。

void win() {
    printf("Code Flow Changed\n");
}

int main() {
    char input[10];
    scanf("%10s",input);
    void (*function)() = (void (*)())input;
    function();
    return 0;
}

win函数的地址是0x0a245101。

当我尝试更改它时,每次我最终更改p / x $ eax值而不是x $ eax。任何人都可以解释x $ eax和p / x $ eax显示的内容。

(gdb) x $eax
0xf7ffb000: 0x0a245101
(gdb) p/x $eax
$2 = 0xf7ffb000

编辑:还请解释这是什么意思。

void (*function)() = (void (*)())input;

2 个答案:

答案 0 :(得分:0)

p/x $eax会显示当前eax中的值。

x $eax不仅会显示当前eax中的值,还会显示eax值的地址值。

抱歉,我的英语不好,希望你能理解......

实际上,它可能有更好的答案here

void (*function)()代表一个函数指针,它可以指向一个不带参数的函数并返回void。

(void (*)())input表示将input转换为不带参数且返回void的函数。

void (*function)() = (void (*)())input;表示使用函数指针指向input的地址,为什么?因为您告诉编译器input已转换为函数。

答案 1 :(得分:0)

Address是一个整数值,而不是char数组。您应该执行以下操作:

void win() {
    printf("Code Flow Changed\n");
}

int main() {
    void *input = 0;
    printf("%p\n", win); // print the address of win
    scanf("%p",&input);  // re-type the address of win
    void (*function)() = (void (*)())input;
    function();
    return 0;
}

我机器上的输出:

0x109d24ef0
0x109d24ef0
Code Flow Changed