assembly 如何开发彩票游戏?

vzgqcmou  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(115)

在利用这段代码并发现如果你输入16个不同的数字Output using exploit后,我试图理解为什么会这样。是因为内存位置吗?

#include <stdio.h>
#include <stdlib.h>
#include<time.h>

int main(int argc, char *argv[]) {
  int entry[6];
  int results[6];
  int i = 0, tmp = 0;

  /* Generate power balls */                                                                   
  srand(time(NULL));                                                                         
  for (int i = 0; i < 6; i++) {                                                       
    results[i] = rand() % 99;                                                           
  }

  printf("RULE: You are to enter a sequence of six two-digit numbers between 10 and 99. \n");
  printf("  - The numbers should be separated by a single space. \n");
  printf("  - The seventh number should be -1, indicating the completion of the sequence \n");
  printf("Enter the numbers: \n");
  while(tmp != -1) {
    scanf("%d", &tmp);
    if (tmp == -1) break;
    entry[i] = tmp;
    i++; 
  }

  /* Check results */
  int match = 0;
  for (int i = 0; i < 6; i++) {
    printf("The lottery number is: %d\n", results[i]);
    printf("Your guess is: %d\n", entry[i]);
    if (results[i] == entry[i]) {
      match++;
    }
  }

  if (match != 6){
    printf("Unfortunately, there has been a mismatch! Better luck next time!\n");
  }
  else {
    printf("Congratulations, all the numbers match! You have won a gazillion dollars \n");
  }
  return 0;
}

我试着找出每个数组的内存位置:Entry/Results系统
但我不明白它们是如何联系在一起的,甚至不知道它们是否是漏洞利用的一部分。

kcrjzv8t

kcrjzv8t1#

在我的机器上,sizeof (int)为4,这些数组以32字节的间隔对齐

(gdb) print &entry
$1 = (int (*)[6]) 0x7fffffffe7b0
(gdb) print &results
$2 = (int (*)[6]) 0x7fffffffe7d0

results被放置在entry之后,并且在它们之间具有8字节的填充。

|entry                  |padding|results                |stack
     | 0 | 1 | 2 | 3 | 4 | 5 | P | P | 0 | 1 | 2 | 3 | 4 | 5 | ? | ? | ? |
i   =  0   1 ...               6   7   8   9 ...      12  13  14  15  16
tmp = 10  12 ...          16  17  18  10  12 ...          16  17  18  -1

直到tmp变为-1i将继续递增,将tmp的值写入entry[i]。这最终溢出entry,并开始写入填充字节,然后写入results数组。
在我的机器上,itmpmatch被放置在数组 * 之前 *,而跟在数组后面的可能是金丝雀,当它们的值被更改时,它们会触发堆栈保护。
仅输入14个值而不是16个值,然后输入-1,会导致results数组被完全覆盖,而不会触发任何堆栈保护。
不过,这些都属于Undefined Behaviour的范围。

相关问题