NewStar CTF[pwn] overwrite WriteUp

vstral的博客 / 2024-10-13 / 原文

IDA打开,查看func()函数,得到以下代码

点击查看代码
unsigned __int64 func()
{
  size_t input1[6]; // [rsp+Ch] [rbp-84h] BYREF
  char nptr[72]; // [rsp+40h] [rbp-50h] BYREF
  unsigned __int64 v3; // [rsp+88h] [rbp-8h]

  v3 = __readfsqword(0x28u);
  printf("pls input the length you want to readin: ");
  __isoc99_scanf("%d", input1);
  if ( SLODWORD(input1[0]) > 48 )
    exit(0);
  printf("pls input want you want to say: ");
  read(0, (char *)input1 + 4, LODWORD(input1[0]));
  if ( atoi(nptr) <= 114514 )
  {
    puts("bad ,your wallet is empty");
  }
  else
  {
    puts("oh you have the money to get flag");
    getflag();
  }
  return v3 - __readfsqword(0x28u);
}

第一次见到LODWORD和SLODWORD和atoi这几个函数,故学习一下作用,ChatGPT给出的解释是:

  1. LOWORD

LOWORD 是一个宏,帮助你从一个较大的数字中提取出最低的 16 位(就是最后两字节)。比如说,如果你有一个数字 0x12345678,用 LOWORD 提取出来的就是 0x5678。
2. SLOWORD

SLOWORD 通常是类似于 LOWORD 的一个自定义宏,用于提取低 16 位,具体功能可能和 LOWORD 相同。
3. atoi

atoi 是一个函数,用于把字符串转换成整数。例如,如果你有字符串 "42",使用 atoi 就可以得到数字 42。如果字符串不是一个有效的数字,atoi 会返回 0。