1

这是代码:

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

请帮助我,我是初学者。

4

2 回答 2

3

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

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

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

于 2021-02-09T10:15:23.627 回答
1

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

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

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

于 2021-02-09T10:14:34.563 回答