我正试图改变这个程序的流程。我要它调用胜利函数。这不是确切的代码,但这将解释代码的作用。
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;发布于 2017-04-08 05:13:40
p/x $eax向您显示当前在eax中的值。
x $eax不仅显示当前在eax中的值,而且显示eax值的地址中的值。
对不起,我的英语很差,希望你能理解.
实际上,它可能有一个更好的答案here
void (*function)()代表一个函数指针,它可以指向不接受参数并返回void的函数。
(void (*)())input的意思是将input转换成一个不接受参数并返回void的函数。
而void (*function)() = (void (*)())input;的意思是使用函数指针指向input的地址,为什么?因为您告诉编译器input已转换为函数。
发布于 2017-04-08 05:48:24
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 Changedhttps://stackoverflow.com/questions/43290413
复制相似问题