一、binfmt_misc介绍
binfmt_misc是Linux内核的一项功能,其使得内核可识别任意类型的可执行文件格式并传递至特定的用户空间应用程序,如模拟器和虚拟机。例如在装有qemu的x86-64的Linux中可以直接执行ARM64程序不需要指明使用qemu。

WebAssembly(简称wasm) 是一种可移植、体积小、加载快并且能够在浏览器上运行的一种程序文件。其能够在JavaScript通过接口进行调用执行。开发者们一直都比较关心JS的运行速度问题,V8引擎在JS的运行速度方面做了巨大的优化,但是少数情况下我们进行大量本地运算的时候,仍然可能遇到性能瓶颈,这个时候webassembly的作用就凸现出来了。例如AutoCAD利用编译器将其沉淀了30多年的代码直接编译成WebAssembly,同时性能基于之前的普通Web应用得到了很大的提升。
C/C++/Rust源代码可以被编译为WebAssembly文件,然后JS层就可以对其进行调用。WebAssembly文件中存储着字节码,位于JavaScript引擎中的WebAssembly虚拟机将会执行字节码。字节码的执行有两种方式,一种是在运行时边读取opcode边执行,另一种则是在执行前将整个WebAssembly JIT翻译为本地汇编代码,然后直接跳转到汇编代码执行。V8采用的是第二种方式。
菜单题,add功能有一个off by null,glibc为2.35
Glibc 2.25 会检查P->fd->bk == P && P->bk->fd == P && size == prev_size,可以将large bin申请回来后,利用原来残留在fd_nextsize,bk_nextsize的指针来作为fakechunk的fd和bk,那么只需要在fd_nextsize对应堆块的bk位置低字节覆盖指向P,同理bk_nextsize对应堆块的fd位置低字节覆盖指向P,由于add时会添加’\0’,因此覆盖最少为2字节,这会导致指针的第2字节固定为0,那么就需要构造堆风水使得fakechunk的地址以X0YY结尾,由于ASLR的原因,X可以出现为0的时候,成功率为1/16。
伪造好chunk以后,利用off by null修改下一个堆块的prev_in_use,然后释放后unlink构造overlap chunk,最后先申请到_IO_2_1_stdout_劫持,泄漏environ拿到栈地址,然后申请到栈上写ROP。
wasmtime的预编译程序,用IDA进行分析,找到字符串
在gdb中对字符串进行硬件读断点rwatch *addr,然后在一个函数断下,根据断下的函数一直向上找上层函数,最终发现这个地方很可能是主菜单逻辑