[proofplan]
We use the local triviality of the vector bundle. On an [open set](/page/Open%20Set) $U \subset M$ where $E$ is identified with $U \times \mathbb{R}^k$, a section over each open subset $V \subset U$ is the same thing as a smooth map $V \to \mathbb{R}^k$. Taking coordinate functions identifies such maps with $k$-tuples of smooth functions on $V$, and these identifications commute with restrictions to smaller open sets. Therefore the section sheaf is locally isomorphic to the free rank $k$ sheaf $(\mathcal{C}^\infty_M|_U)^k$.
[/proofplan]
[step:Choose a local trivialization near the given point]
Let $p \in M$. Since $\pi: E \to M$ is a smooth vector bundle of rank $k$, there exists an open neighbourhood $U \subset M$ of $p$ and a smooth vector bundle trivialization
\begin{align*}
\Phi: \pi^{-1}(U) &\to U \times \mathbb{R}^k
\end{align*}
such that the projection identity
\begin{align*}
\operatorname{pr}_1 \circ \Phi = \pi|_{\pi^{-1}(U)}
\end{align*}
holds, where $\operatorname{pr}_1: U \times \mathbb{R}^k \to U$ is the first projection. For each $x \in U$, the induced map
\begin{align*}
\Phi_x: E_x &\to \mathbb{R}^k
\end{align*}
is a linear isomorphism, where $E_x := \pi^{-1}(\{x\})$ is the fibre over $x$.
[/step]
[step:Identify sections over each open subset with tuples of smooth functions]
Let $V \subset U$ be open. Define a map of $\mathcal{C}^\infty_M(V)$-modules
\begin{align*}
T_V: \mathcal{E}(V) &\to \mathcal{C}^\infty_M(V)^k
\end{align*}
as follows. For $s \in \mathcal{E}(V)$, the composite
\begin{align*}
\Phi \circ s: V &\to U \times \mathbb{R}^k
\end{align*}
has first component equal to $\operatorname{id}_V$, because
\begin{align*}
\operatorname{pr}_1 \circ \Phi \circ s
= \pi \circ s
= \operatorname{id}_V.
\end{align*}
Hence there is a unique smooth map
\begin{align*}
f_s: V &\to \mathbb{R}^k
\end{align*}
such that
\begin{align*}
\Phi(s(x)) = (x, f_s(x))
\end{align*}
for every $x \in V$. Writing $f_s = (f_{s,1}, \dots, f_{s,k})$, with each coordinate function
\begin{align*}
f_{s,i}: V &\to \mathbb{R},
\end{align*}
we define
\begin{align*}
T_V(s) := (f_{s,1}, \dots, f_{s,k}).
\end{align*}
Conversely, given $(g_1,\dots,g_k) \in \mathcal{C}^\infty_M(V)^k$, define the smooth map $g: V \to \mathbb{R}^k$ by
\begin{align*}
g(x) = (g_1(x), \dots, g_k(x)).
\end{align*}
Then define the map $S_V(g_1,\dots,g_k): V \to E$ by
\begin{align*}
S_V(g_1,\dots,g_k)(x) = \Phi^{-1}(x,g(x)).
\end{align*}
Since $\Phi^{-1}: U \times \mathbb{R}^k \to \pi^{-1}(U)$ and $x \mapsto (x,g(x))$ are smooth, $S_V(g_1,\dots,g_k)$ is smooth. Moreover,
\begin{align*}
\pi(S_V(g_1,\dots,g_k)(x))
= \pi(\Phi^{-1}(x,g(x)))
= x,
\end{align*}
so $S_V(g_1,\dots,g_k) \in \mathcal{E}(V)$.
The maps $T_V$ and $S_V$ are inverse to each other. Indeed, for $s \in \mathcal{E}(V)$,
\begin{align*}
S_V(T_V(s))(x)
= \Phi^{-1}(x,f_s(x))
= s(x),
\end{align*}
and for $(g_1,\dots,g_k) \in \mathcal{C}^\infty_M(V)^k$,
\begin{align*}
T_V(S_V(g_1,\dots,g_k)) = (g_1,\dots,g_k).
\end{align*}
Thus $T_V$ is a bijection.
It remains to check module-linearity. Let $a \in \mathcal{C}^\infty_M(V)$ and let $s,t \in \mathcal{E}(V)$. The $\mathcal{C}^\infty_M(V)$-module structure on sections is fibrewise: for every $x \in V$,
\begin{align*}
(s+t)(x) = s(x)+t(x).
\end{align*}
Also, for every $x \in V$,
\begin{align*}
(a s)(x) = a(x)s(x).
\end{align*}
Because each fibre map $\Phi_x: E_x \to \mathbb{R}^k$ is linear, the coordinate functions satisfy
\begin{align*}
T_V(s+t) = T_V(s)+T_V(t).
\end{align*}
They also satisfy
\begin{align*}
T_V(a s) = a\,T_V(s).
\end{align*}
Therefore
\begin{align*}
T_V: \mathcal{E}(V) &\to \mathcal{C}^\infty_M(V)^k
\end{align*}
is an isomorphism of $\mathcal{C}^\infty_M(V)$-modules.
[guided]
The purpose of the trivialization is to turn a section of $E$ into an ordinary vector-valued function. Let $V \subset U$ be open. We define
\begin{align*}
T_V: \mathcal{E}(V) &\to \mathcal{C}^\infty_M(V)^k
\end{align*}
by taking a section $s: V \to E$ and writing it in the chosen trivialization. Since $s$ is a section, it satisfies $\pi \circ s = \operatorname{id}_V$. Since $\Phi$ is a trivialization over $U$, it satisfies
\begin{align*}
\operatorname{pr}_1 \circ \Phi = \pi|_{\pi^{-1}(U)}.
\end{align*}
Therefore
\begin{align*}
\operatorname{pr}_1 \circ \Phi \circ s
= \pi \circ s
= \operatorname{id}_V.
\end{align*}
This means that $\Phi(s(x))$ has first coordinate $x$. Hence there is a unique smooth map
\begin{align*}
f_s: V &\to \mathbb{R}^k
\end{align*}
such that
\begin{align*}
\Phi(s(x)) = (x,f_s(x)).
\end{align*}
Writing $f_s=(f_{s,1},\dots,f_{s,k})$, where each
\begin{align*}
f_{s,i}: V &\to \mathbb{R}
\end{align*}
is smooth, we set
\begin{align*}
T_V(s) := (f_{s,1},\dots,f_{s,k}).
\end{align*}
Now we construct the inverse map explicitly. Given a tuple $(g_1,\dots,g_k) \in \mathcal{C}^\infty_M(V)^k$, define the smooth map $g: V \to \mathbb{R}^k$ by
\begin{align*}
g(x) = (g_1(x),\dots,g_k(x)).
\end{align*}
Then define the map $S_V(g_1,\dots,g_k): V \to E$ by
\begin{align*}
S_V(g_1,\dots,g_k)(x) = \Phi^{-1}(x,g(x)).
\end{align*}
This map is smooth because it is the composite of the smooth map $x \mapsto (x,g(x))$ with the smooth map $\Phi^{-1}$. It is also a section, since
\begin{align*}
\pi(S_V(g_1,\dots,g_k)(x))
= \pi(\Phi^{-1}(x,g(x)))
= x.
\end{align*}
Therefore $S_V(g_1,\dots,g_k) \in \mathcal{E}(V)$.
The two constructions undo one another. Starting with a section $s$, the definition of $f_s$ gives
\begin{align*}
S_V(T_V(s))(x)
= \Phi^{-1}(x,f_s(x))
= s(x).
\end{align*}
Starting with a tuple $(g_1,\dots,g_k)$, the section $S_V(g_1,\dots,g_k)$ has trivialized form $(x,g(x))$, so its coordinate functions are exactly $g_1,\dots,g_k$:
\begin{align*}
T_V(S_V(g_1,\dots,g_k)) = (g_1,\dots,g_k).
\end{align*}
Thus $T_V$ is a bijection.
Finally, the bijection respects the module structures because $\Phi$ is fibrewise linear. For $a \in \mathcal{C}^\infty_M(V)$ and $s,t \in \mathcal{E}(V)$, addition and scalar multiplication of sections are defined fibrewise. For every $x \in V$,
\begin{align*}
(s+t)(x) = s(x)+t(x).
\end{align*}
Also, for every $x \in V$,
\begin{align*}
(a s)(x) = a(x)s(x).
\end{align*}
Since $\Phi_x: E_x \to \mathbb{R}^k$ is linear for every $x \in V$, these operations become componentwise addition and scalar multiplication on $\mathcal{C}^\infty_M(V)^k$. Hence
\begin{align*}
T_V(s+t) = T_V(s)+T_V(t).
\end{align*}
Similarly,
\begin{align*}
T_V(a s) = a\,T_V(s).
\end{align*}
Therefore $T_V$ is an isomorphism of $\mathcal{C}^\infty_M(V)$-modules.
[/guided]
[/step]
[step:Verify compatibility with restrictions]
Let $W \subset V \subset U$ be open subsets. Denote by
\begin{align*}
\rho^{\mathcal{E}}_{V,W}: \mathcal{E}(V) &\to \mathcal{E}(W)
\end{align*}
the restriction map of the section sheaf, and denote by
\begin{align*}
\rho^{\mathcal{C},k}_{V,W}: \mathcal{C}^\infty_M(V)^k &\to \mathcal{C}^\infty_M(W)^k
\end{align*}
the componentwise restriction map of the free sheaf.
For $s \in \mathcal{E}(V)$, write
\begin{align*}
T_V(s) = (f_{s,1},\dots,f_{s,k}).
\end{align*}
For every $x \in W$,
\begin{align*}
\Phi((s|_W)(x)) = \Phi(s(x)) = (x,f_s(x)).
\end{align*}
Thus the coordinate functions of $s|_W$ are the restrictions $f_{s,i}|_W$, and hence
\begin{align*}
T_W(\rho^{\mathcal{E}}_{V,W}(s))
= \rho^{\mathcal{C},k}_{V,W}(T_V(s)).
\end{align*}
Therefore the family of module isomorphisms $(T_V)_{V \subset U}$ is compatible with restriction maps.
[/step]
[step:Assemble the local sheaf isomorphism]
Because the maps
\begin{align*}
T_V: \mathcal{E}(V) &\to \mathcal{C}^\infty_M(V)^k
\end{align*}
are $\mathcal{C}^\infty_M(V)$-module isomorphisms for every open $V \subset U$ and commute with all restriction maps, they define an isomorphism of sheaves of $\mathcal{C}^\infty_M|_U$-modules
\begin{align*}
\mathcal{E}|_U &\cong (\mathcal{C}^\infty_M|_U)^k.
\end{align*}
Since $p \in M$ was arbitrary, such an open neighbourhood $U$ exists around every point of $M$. Hence $\mathcal{E}$ is locally free of rank $k$ as a sheaf of $\mathcal{C}^\infty_M$-modules.
[/step]