【问题标题】:How does Visual Studio decide the order in which stack variables should be allocated?Visual Studio 如何决定分配堆栈变量的顺序?
【发布时间】:2011-02-15 17:21:25
【问题描述】:

我正在尝试将gera's Insecure Programming by example 中的一些程序转换为客户端/服务器应用程序,这些应用程序可用于捕获标志场景以教授漏洞利用开发。我遇到的问题是我不确定 Visual Studio(我使用的是 2005 专业版)如何决定在堆栈上分配变量的位置。

当我编译并运行示例 1 时:

int main() {
    int cookie;
    char buf[80];

    printf("buf: %08x cookie: %08x\n", &buf, &cookie);
    gets(buf);

    if (cookie == 0x41424344)
        printf("you win!\n");
}

我得到以下结果:

buf: 0012ff14 cookie: 0012ff64

buf 从比cookie 低八十个字节的地址开始,在前八十个之后复制到buf 中的任何四个字节都会出现在cookie 中。

我遇到的问题是当我将此代码放在其他函数中时。当我编译并运行以下代码时,我得到了不同的结果:buf 出现在大于cookie 的地址。

void ClientSocketHandler(SOCKET cs){
 int cookie;
 char buf[80];
 char stringToSend[160];
 int numBytesRecved;
 int totalNumBytes;

 sprintf(stringToSend,"buf: %08x cookie: %08x\n",&buf,&cookie);
 send(cs,stringToSend,strlen(stringToSend),NULL);

结果是:

buf: 0012fd00 cookie: 0012fcfc

现在无法通过覆盖buf 将cookie 设置为任意数据。有没有办法告诉 Visual Studio 在buf 之前分配cookie?有什么方法可以预先告诉变量将如何分配?

谢谢,

杰森

啊,好吧。是的,我猜结构必须这样做。感谢您的帮助。

【问题讨论】:

    标签: visual-studio compiler-construction stack-overflow stack


    【解决方案1】:

    尝试关闭编译器优化。

    如果优化已经关闭,那么强制编译器按特定顺序放置局部变量的最佳选择是将局部变量放入一个结构中,然后将该结构分配到局部堆栈上。与独立的本地变量相比,该结构中的字段不太可能被编译器移动(相对于彼此)。

    【讨论】:

      猜你喜欢
      • 2010-11-09
      • 2010-12-23
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 2012-06-11
      • 2012-11-23
      • 1970-01-01
      相关资源
      最近更新 更多