It depends on how raw you want to go. Here is an approach that maintains the symbolic character of the formalism:
ClearAll[convertToS, convertFromS, add];
convertToS[0] := 0;
convertToS[n_] := Last[ComposeList[ConstantArray[S, n], 0]];
convertFromS[chain_] := Count[chain, S, Infinity, Heads -> True];
add[a_, 0] := a;
add[0, a_] := a;
add[chain1_, S[chain2_]] := add[S[chain1], chain2];
five = convertToS[5]
sixtyFour = convertToS[64]
add[five, sixtyFour] // convertFromS
S[S[S[S[S[0]]]]]
S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[S[0]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
69
Here the convertToS and convertFromS functions are "outside" the system. Addition just involves commuting all S symbols to the chain on the left. Offhandedly I'm not quite sure how the product could be defined, but it could be done through copying. Philosophically though, in trying to define the numbers you can't escape the usage of them in the first place, implicitly or otherwise.
{}button above the edit window. The edit window help button?is also useful for learning how to format your questions and answers. – Michael E2 Dec 19 '14 at 00:14