Basics of C/C++ Programming

From ICO wiki
Revision as of 01:44, 26 September 2017 by Jtominga (talk | contribs) (Lectures)
Jump to navigationJump to search

Introduction

Lecturers

Rait Liiv: rait.liiv@itcollege.ee

Janno Tomingas: janno.tomingas@itcollege.ee

C

Lectures

Practices

Practice 1

Console input/output, conditions, loops, pointers, arrays, functions


Practice 2

File input/output, dynamic memory allocation, structs, .h/.c files


1. Write a program that outputs the contents of a text file into the console character by character.

Additional info:

2. Write a program that dynamically allocates a small array of ints. Fill the array and print its contents. Free the memory after you're done using it.

3. Write a program that reads the contents of a whole text file into a dynamically sized array of characters (and outputs the information into a new file).

Additional info:

4. Create an implementation of a stack data structure (Stack (abstract data type)) that uses a dynamically allocated array for storage.

  • Required functions:
    • init - Initializes stack's variables and allocates required dynamic memory with an initial(default) size,
    • destroy - Frees all allocated memory and optionally resets other stored information for a stack,
    • push - Adds an element to the top of the stack,
    • peek - Gets the top element of the stack,
    • pop - Gets and removes the top element of the stack;


  • Describe the stack struct and functions in a separate .h file,
  • Implement the functions in a corresponding .c file,
  • Test your stack with some operations. Remember to check for edge cases;
Hints:

5. Write a program that reads an unknown number of integers (each on a separate line) from a file into the stack you created. After reading the whole file, print out all ints that were read (in reverse order).

Assignment

Write a program that reads values from a file and outputs the result to stdout.

Input

Input file's name is "input.txt".

The file contains index-value pairs of integers on a single line. Integers in a pair are separated with a comma (,) and pairs are separated with a semicolon (;).

All indices between 0 and (count_of_pairs - 1) are guaranteed to be present.

The indices are guaranteed to be unique.

The indices are not guaranteed to appear in an ascending order.

Sample input: 1,4;0,2;2,8

Output

The program should output the differences between consecutive values as the index increases.

Output should be printed as a comma separated list of values on a single line to stdout.

For input:

0,1;2,4;1,2

Calculates:

0,1 to 1,2 -> 2 - 1 = 1
1,2 to 2,4 -> 4 - 2 = 2

And outputs:

1,2
Examples
->
0,2 -> 0
1,2;0,1 -> 1
1,4;0,2;2,8 -> 2,4
1,4;0,2;2,-2 -> 2,-6

C++

Lectures C++

Practices

Assignment

Exploits

Lectures

Practices

Practice 1

Assembly language

Setting up your environment:

  • Create a new empty project,
  • Add a main.cpp file,
  • Under project "Properties -> C/C++ -> Code Generation" set Security Check to Disable Security Check;

To view disassembly:

  • While debugging your program, open the disassembly window at Debug -> Windows -> Disassembly;


2. Create an integer variable i:

  • Assign a value to i,
  • Add 1 to i,
  • Inspect the resulting assembly instructions;


3. Using what you have learned:

  • Create an integer variable a,
  • Using assembly, assign a value to a,
  • Using assembly, add 1 to a,
  • Verify, that the resulting value is correct;


4. Create a character array c to hold 3 characters:

  • Fill in the array one by one,
  • Inspect the resulting assembly instructions;


5. Using what you have learned:

  • Create a integer array d to hold 2 ints,
  • Using assembly, fill the array with data,
  • Verify, that the array is filled with expected values;


6. Create a simple if:

  • Subtract 1 from int i if i is equal to 2,
  • Inspect the resulting assembly instructions;


7. Using what you have learned:

  • Create an if conditional, that subtracts 1 from int a if int i and a are equal,
  • Verify, that the conditional works as expected;
Practice 2

Assembly language continued, stack smashing

1. Create a function that takes no arguments

  • Call the function
  • Inspect the resulting assembly instructions;


2. Using what you have learned:

  • Call the function using assembly,
  • Verify that the function gets called;


3. Create an add function:

  • The function should return the result of adding two integers passed in as parameters,
  • Call the function and store the result in a variable,
  • Inspect the resulting assembly instructions;


4. Using what you have learned:

  • Create a subtract function,
  • Use assembly to call the subtract function with different values and store the result in a variable,
  • Verify, that the function call works as expected and that the value gets stored;


5. Create a function that internally holds an array of only one void* and takes a void* as a parameter:

  • Write over the bounds of the array and observe what happens,
  • Try passing different pointers to the function;


Assignment

Do some research on vulnerabilities related to the following topics:

  • Buffer overflow (stack smashing, code injection, arc injection),
  • Arithmetic over-/underflow,
  • Memory leaks,
  • Double free (and double delete),
  • Formatted output,
  • Concurrency,
  • File I/O (symlinks, hardlinks);


Write an essay, that describes the causes, examples, and mitigation strategies for all of the topics.

History

Basics_of_C/C++_Programming 2016