这个语法 *((unsigned int *)(buffer+i)) 在 C 中是什么意思

问题描述

这是代码

char *command,*buffer;

command = (char *) malloc(200);
bzero(command,200);

strcpy(command,"./notesearch \'");
buffer = command + strlen(command);
for(int i=0; i < 160; i+=4) {
    *((unsigned int *)(buffer+i)) = ret; // What does this Syntax mean?
}

您可以在此处获取完整代码 => https://raw.githubusercontent.com/intere/hacking/master/booksrc/exploit_notesearch.c

请帮助我,我是初学者。

解决方法

从内部到外部阅读。这里我们必须假设 buffer 是指向某个内存区域或数组元素的指针。 你有:

  • buffer + 1 ==> 下一个内存位置或下一个数组元素的地址
  • (unsigned int *)(buffer+i) ==> 将结果指针转换为 unsigned int 类型的指针。
  • *((unsigned int *)(buffer+i)) ==> 取消引用 unsigned int 指出的(获取值)。
  • *((unsigned int *)(buffer+i)) = ret; ==> 将值赋给变量 ret

在 C 中,计算表达式时,总是从内到外。

,

这会将 unsigned int ret 写入地址 buffer+i

*((unsigned int *)(buffer+i)) = ret
  • buffer+i 是一个 char*(指向 char 的指针)
  • (unsigned int *) 中的 (unsigned int *)(buffer+i) 将指向 char 的指针转换为指向 unsigned int 的指针。这称为演员
  • 最后,* 将此指针取消引用到 unsigned int 并将 ret 写入该地址。

请注意,根据您的硬件架构,这可能会因为对齐问题而失败。