Add the rest of university notes

This commit is contained in:
John Gatward committed 2026-10-04 14:02:35 +01:00
1 parent c1b84c7f7d
commit d0f27f276b
366 files changed
+9844 -110

No files matched your search

+147
View File
@@ -0,0 +1,147 @@
# Exploits
- The easiest way of getting access to a machine is having the user install something for you
- A software or hardware bug that allows an attacker to circumvent an OS’ security perimeter
#### Memory Management
- In C and C++, the programmer performs memory management
- Flexible, powerful, fast but dangerous
- Buffer Overruns
- Stack Overruns
- Heap Overruns
- Memory-managed languages avoid this, but of course may have their own vulnerabilities
### Buffer Overflows
- When a program is executed, contiguous blocks of memory can be allocated to store arrays (buffers)
- If data is written into a buffer that exceeds its size, an overflow occurs
- The data will overwrite the memory beyond the buffer
#### Program Memory
- Memory is stored in virtual address space from `0x0000...` to `0xFFFF...`
- Parts of the program are held in different regions by convention
- Different restrictions are placed on these regions
![1646677005.png](img/1646677005.png)
##### The Stack
The stack holds information on local variables and function calls (stack frames)
1. A function call will push a new frame onto the stack
2. A return will pop it off, and go to `ret`
```c
void function(int a, int b, int c)
{
char buffer1[5];
char buffer2[10];
}
void main()
{
function(1,2,3);
}
```
![1646677112.png](img/1646677112.png)
###### Stack Smashing
- In C and C++, low level functions like `strcpy` perform no bounds checking at all
- This is partly due to the fact strings are null terminated, if we provide no null character `strcpy` will continue to run
- If `str` is long, we can write into other memory
```c
void function(char *str)
{
// allocate local buffer
char buffer[128];
// Copy str into local buffer
strcpy(buffer, str);
}
```
![1646677357.png](img/1646677357.png)
###### Stack Canaries
- Stack canaries modify the prologue and epilogue of all functions to check a value ion front of the return address is unchanged
![1646679244.png](img/1646679244.png)
- If you can work out the canary value, there is no issue
###### Data Execution Prevention (NX)
- Modern operating systems will mark the stack as non-executable
- `NX` on AMD, `XD` on Intel and `XN` on arm
- An `NX` stack means that adding in our exploit code won’t work
- We can circumvent this using a `return-to-libc` attack
###### Further Protection
- To defeat `ret2lib2` various `0x0` null bytes are inserted into standard library addresses
- Developers also restrict access to obvious system calls
- Address Space Layout Randomisation (`ASLR`) moves the address of library and programs around
- They don’t have to move too much before your hand-crafted `ret` addresses will break
###### Return-Oriented Programming
- Lets forget about injecting code, how about just using existing code in the actual exploitable program
- No individual section of this program will do what we want
- Find short sections, *gadgets* and link them together
![1646679620.png](img/1646679620.png)
##### Race Conditions
- With concurrent threads or processes, timing can lead to security vulnerabilities
![1646679670.png](img/1646679670.png)
- Here the victim unknowingly modifies the wrong file
- This can happen because the CPU context switches and can execute these two processes simultaneously
- Running this continuously for about 10 minutes, this will work once
##### Heartbleed
- Heartbleed is a bug in `OpenSSL`
- Open source `SSL` library
- Started in `OpenBSD`
- Used almost *everywhere*
- Specifically targeted the heartbeat extension
- Extension to regular `SSL` and used for keep-alive purposes, to stop quiet connections being closed
- Client sends a message to the server to say it’s alive
- Server responds (also alive)
![1646679952.png](img/1646679952.png)
**The Bug**
```c
buffer = OPENSSL_malloc(1 + 2 + payload + padding);
bp = buffer;
/* Enter response type, length and copy payload */
*bp++ = TLS1_HB_RESPONSE;
s2n(payload, bp);
memcpy(bp, p1, payload); //BAD
bp += payload;
/* Random padding */
RAND_pseudo_bytes(bp, padding);
r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload +
padding);
if (r >= 0 && s->msg_callback)
s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
buffer, 3 + payload + padding,
s, s->msg_callback_arg);
```
This bug would just memcpy a bunch of the server’s ram and send it back to the client. This can expose RSA keys.
This is called a **buffer overread** attack.