我正在尝试完成一个涉及覆盖函数指针的缓冲区溢出。易受攻击的C程序如下:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
void win()
{
printf("code flow successfully changed\n");
}
int main(int argc, char **argv)
{
volatile int (*fp)();
char buffer[64];
fp = 0;
gets(buffer);
if(fp) {
printf("calling function pointer, jumping to 0x%08x\n", fp);
fp();
}
}
我已经在程序上运行了gdb,发现“buffer”的大小是72字节,函数地址是0x555546ca。所以,我输入了
python3.6 -c "print('A' * 72 + '\xca\x46\x55\x55')" | ./stack3
得到一个奇怪的结果:
calling function pointer 0x55468ac3
Segmentation fault (core dumped)
检查内存后,我发现缓冲区已正确填充0x41,但接下来的两个字(fp *)分别为0x55468ac3和0x00000055。我无法理解为什么数据会以这种方式被遮挡。