gdb中源代码和进程之间的区别

时间:2016-11-11 11:35:20

标签: c gdb malloc exploit

我试图解决Protostar heap2。

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>

struct auth {
  char name[32];
  int auth;
};

struct auth *auth;
char *service;

int main(int argc, char **argv)
{
  char line[128];

  while(1) {
      printf("[ auth = %p, service = %p ]\n", auth, service);

      if(fgets(line, sizeof(line), stdin) == NULL) break;

      if(strncmp(line, "auth ", 5) == 0) {
          auth = malloc(sizeof(auth));
          memset(auth, 0, sizeof(auth));
          if(strlen(line + 5) < 31) {
              strcpy(auth->name, line + 5);
          }
      }
      if(strncmp(line, "reset", 5) == 0) {
          free(auth);
      }
      if(strncmp(line, "service", 6) == 0) {
          service = strdup(line + 7);
      }
      if(strncmp(line, "login", 5) == 0) {
          if(auth->auth) {
              printf("you have logged in already!\n");
          } else {
              printf("please enter your password\n");
          }
      }
  }
}

源代码如上。 在malloc(sizeof(auth));我认为参数将是36或更多。 但结果是4。

0x080489a7 <main+115>:  movl   $0x4,(%esp)
---Type <return> to continue, or q <return> to quit---
0x080489ae <main+122>:  call   0x804916a <malloc>

这是gdb中的程序集。我不明白为什么参数是4。 任何人都可以解释原因吗?

0 个答案:

没有答案