这题是全国大学生信息安全竞赛的一道线下半决赛题目,好像是华南赛区?
例行检查。
分析程序。
vul函数

两个系统调用,一个是sys_read,一个是sys_write,往栈上写数据(0x400),从栈上读数据(0x30),存在栈溢出。
还有一个gadget函数。

有两个值得注意的地方。mov rax,0fh 以及mov rax 59。这两个gadget控制了rax的值,看看这两个是什么系统调用。
15 sys_rt_sigreturn
59 sys_execve
解法一
59号系统调用是execve那么就可以想办法控制寄存器的值调用execve("/bin/sh",0,0),注意在调用execve时,后面两个参数需要置0,由于需要控制rdx的值,所以选择使用通用gadget,__libc_csu_init。

r13的值会给到rdx,让rbx=0,下面call的时候会变为call [r12],会去call r12指向位置的代码,我们可以调到后面的rop执行,所以需要知道栈的地址,我们获取/bin/sh字符串时也需要知道栈地址。这题刚好在write的时候0x28这个位置是栈上的值,于是通过计算可以得到栈上/bin/sh的地址,即rsp-0x10的值。
from pwn import *
io=process('pwn')
main=0x0004004ED
execv=0x04004E2
pop_rdi=0x4005a3
pop_rbx_rbp_r12_r13_r14_r15=0x40059A
mov_rdxr13_call=0x0400580
sys=0x00400517
pl1=
全国大学生信息安全竞赛:ciscn_2019_s_3漏洞利用解析

本文详细分析了全国大学生信息安全竞赛中ciscn_2019_s_3题目,涉及栈溢出、系统调用`sys_read`和`sys_write`,以及潜在的`sys_execve`和`sys_rt_sigreturn`利用。通过控制寄存器值,实现调用`/bin/sh`获取shell,或者利用`sigreturn`恢复用户态环境来控制程序流程。
最低0.47元/天 解锁文章
1728

被折叠的 条评论
为什么被折叠?



