mirror of
https://github.com/janishutz/eth-summaries.git
synced 2026-03-14 17:00:05 +01:00
[SPCA] Update code imports
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
\subsection{Basics}
|
||||
\texttt{C} uses a very similar syntax as many other programming languages, like \texttt{Java}, \texttt{JavaScript} and many more\dots
|
||||
to be precise, it is \textit{them} that use the \texttt{C} syntax, not the other way around. So:
|
||||
\inputcodewithfilename{c}{code-examples/00_c/00_basics/}{00_intro.c}
|
||||
\inputcodewithfilename{c}{}{code-examples/00_c/00_basics/00_intro.c}
|
||||
|
||||
In \texttt{C} we are referring to the implementation of a function as a \bi{(function) definition} (correspondingly, \textit{variable definition}, if the variable is initialized)
|
||||
and to the definition of the function signature (or variables, without initializing them) as the \bi{(function) declaration} (or, correspondingly, \textit{variable declaration}).
|
||||
@@ -9,4 +9,4 @@ and to the definition of the function signature (or variables, without initializ
|
||||
\texttt{C} code is usuallt split into the source files, ending in \texttt{.c} (where the local functions and variables are declared, as well as all function definitions)
|
||||
and the header files, ending in \texttt{.h}, usually sharing the filename of the source file, where the external declarations are defined.
|
||||
By convention, no definition of functions are in the \texttt{.h} files, and neither variables, but there is nothing preventing you from putting them there.
|
||||
\inputcodewithfilename{c}{code-examples/00_c/00_basics/}{01_func.h}
|
||||
\inputcodewithfilename{c}{}{code-examples/00_c/00_basics/01_func.h}
|
||||
|
||||
@@ -9,6 +9,6 @@ And because the labels are (as in Assembly) simply skipped over during execution
|
||||
We can also use \texttt{continue} and \texttt{break} statements similarly to \texttt{Java}, they do not however accept labels.
|
||||
(Reminder: \texttt{continue} skips the loop body and goes to the next iteration)
|
||||
|
||||
\inputcodewithfilename{c}{code-examples/00_c/00_basics/}{01_func.c}
|
||||
\inputcodewithfilename{c}{}{code-examples/00_c/00_basics/01_func.c}
|
||||
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
We have already seen a few examples for how \texttt{C} handles declarations.
|
||||
In concept they are similar (and scoping works the same) to most other \texttt{C}-like programming languages, including \texttt{Java}.
|
||||
|
||||
\inputcodewithfilename{c}{code-examples/00_c/00_basics/}{02_declarations.c}
|
||||
\inputcodewithfilename{c}{}{code-examples/00_c/00_basics/02_declarations.c}
|
||||
|
||||
\newpage
|
||||
A peculiarity of \texttt{C} is that the bit-count is not defined by the language, but rather the hardware it is compiled for.
|
||||
|
||||
@@ -5,4 +5,4 @@
|
||||
Unlike some other programming languages, arrays are \bi{not} dynamic length.
|
||||
|
||||
The below snippet includes already some pointer arithmetic tricks. The variable \texttt{data} is a pointer to the first element of the array.
|
||||
\inputcodewithfilename{c}{code-examples/00_c/00_basics/}{03_arrays.c}
|
||||
\inputcodewithfilename{c}{}{code-examples/00_c/00_basics/03_arrays.c}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
with length of the array $n + 1$ (where $n$ is the number of characters of the string).
|
||||
The extra element is the termination character, called the \texttt{null character}, denoted \verb|\0|.
|
||||
To determine the actual length of the string (as it may be padded), we can use \verb|strnlen(str, maxlen)| from \texttt{string.h}
|
||||
\inputcodewithfilename{c}{code-examples/00_c/00_basics/}{04_strings.c}
|
||||
\inputcodewithfilename{c}{}{code-examples/00_c/00_basics/04_strings.c}
|
||||
|
||||
@@ -11,7 +11,7 @@ When a procedure returns, the stack frame is deallocated and any necessary clean
|
||||
|
||||
Of note is that if you simply declare a pointer using \texttt{type * p;} you will get different memory addresses every time.
|
||||
The (Linux)-Kernel randomizes the address space to prevent some common exploits.
|
||||
\inputcodewithfilename{c}{code-examples/00_c/00_basics/}{05_pointers.c}
|
||||
\inputcodewithfilename{c}{}{code-examples/00_c/00_basics/05_pointers.c}
|
||||
|
||||
\newpage
|
||||
\begin{scriptsize}
|
||||
|
||||
@@ -10,7 +10,7 @@ Be wary of including files twice, as the preprocessor will recursively include a
|
||||
The \lC\ preprocessor gives us what are called \texttt{preprocessor macros}, which have the format \verb|#define NAME SUBSTITUTION|.
|
||||
\rmvspace
|
||||
|
||||
\inputcodewithfilename{c}{code-examples/00_c/01_preprocessor/}{00_macros.c}
|
||||
\inputcodewithfilename{c}{}{code-examples/00_c/01_preprocessor/00_macros.c}
|
||||
|
||||
To avoid issues with semicolons at the end of preprocessor macros that wrap statements that cannot end in semicolons, we can use a concept called semicolon swallowing.
|
||||
For that, we wrap the statements in a \texttt{do \dots\ while(0)} loop, which is removed by the compiler on compile, also taking with it the semicolon.
|
||||
|
||||
@@ -3,7 +3,7 @@ In comparison to most other languages, \lC\ does not feature automatic memory ma
|
||||
This of course has both advantages and disadvantages.
|
||||
|
||||
\rmvspace
|
||||
\inputcodewithfilename{c}{code-examples/00_c/02_memory/}{00_memory.c}
|
||||
\inputcodewithfilename{c}{}{code-examples/00_c/02_memory/00_memory.c}
|
||||
\drmvspace
|
||||
|
||||
Notably, the argument \texttt{size\_t sz} for \texttt{malloc}, \texttt{calloc} and \texttt{realloc} is an \texttt{unsigned} integer of some size
|
||||
@@ -15,7 +15,7 @@ you get undefined behaviour.
|
||||
\warn{Memory corruption} There are many ways to corrupt memory in \lC. The below code shows off a few of them:
|
||||
|
||||
\rmvspace
|
||||
\inputcodewithfilename{c}{code-examples/00_c/02_memory/}{01_mem-corruption.c}
|
||||
\inputcodewithfilename{c}{}{code-examples/00_c/02_memory/01_mem-corruption.c}
|
||||
\drmvspace
|
||||
|
||||
\warn{Memory leaks} If we allocate memory, but never free it, we use more and more memory (old memory is inaccessible)
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
Variadic functions take a variable number of arguments and use the \texttt{...} syntax in \lC.
|
||||
A notable example of such a function is \texttt{printf}
|
||||
\inputcodewithfilename{c}{code-examples/00_c/03_others/}{00_variadic.c}
|
||||
\inputcodewithfilename{c}{}{code-examples/00_c/03_others/00_variadic.c}
|
||||
|
||||
@@ -23,7 +23,7 @@ There are 2 ways to do this:
|
||||
|
||||
For example, consider this code:
|
||||
|
||||
\inputcodewithfilename{c}{code-examples/00_c/05_vulnerabilities/}{01_buffer_overflow_echo.c}
|
||||
\inputcodewithfilename{c}{}{code-examples/00_c/05_vulnerabilities/01_buffer_overflow_echo.c}
|
||||
|
||||
This is a problem, since \texttt{echo} may be compiled to something similar to this:
|
||||
|
||||
@@ -44,4 +44,4 @@ Return-oriented Programming is a more sophisticated exploit, which does not rely
|
||||
|
||||
The key idea is: Overwrite return addresses and jump to \textit{specific} machine instruction sequences \textit{already present} in process memory.
|
||||
|
||||
% This is only covered in the attack-lab exercise, not the slides.
|
||||
% This is only covered in the attack-lab exercise, not the slides.
|
||||
|
||||
Reference in New Issue
Block a user