我正在尝试更改此程序的流程。我想让它调用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;
答案 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