chore: Syntax Highlighting
This commit is contained in:
@@ -16,7 +16,7 @@
|
||||
|
||||
以最基本的 C 语言为例,C 语言的函数局部变量就保存在栈中。
|
||||
|
||||
```C
|
||||
```c
|
||||
#include<stdio.h>
|
||||
int main()
|
||||
{
|
||||
@@ -33,7 +33,7 @@ int main()
|
||||
可以发现`ch`和`ch2`刚好差`8`个字节,也就是`ch`的长度。
|
||||
`ch`只有`8`个字节,那么如果我们向`ch`中写入超过`8`个字节的数据呢?很显然,会从`ch`处发生溢出,写入到`ch2`的空间中,覆盖`ch2`的内容。
|
||||
|
||||
```C
|
||||
```c
|
||||
#include<stdio.h>
|
||||
int main()
|
||||
{
|
||||
@@ -54,7 +54,7 @@ int main()
|
||||
|
||||
对于以上程序,“栈溢出”带来的后果仅仅是修改了局部变量的值,会造成一些程序的逻辑错误:
|
||||
|
||||
```C
|
||||
```c
|
||||
#include<stdio.h>
|
||||
int main()
|
||||
{
|
||||
@@ -81,7 +81,7 @@ int main()
|
||||
|
||||
在 C 语言编译之后,通常会产生汇编语言,汇编语言的字节码可以直接在物理 CPU 上运行。而 C 语言函数调用会被编译为如下形式:
|
||||
|
||||
```C
|
||||
```c
|
||||
#include<stdio.h>
|
||||
int add(int a,int b)
|
||||
{
|
||||
@@ -187,20 +187,20 @@ ROP 网上已有非常系统的资料,在这里不做过多的叙述,可参
|
||||
|
||||
格式化字符串的利用思路来源于`printf`函数中的`%n`format 标签,该标签的作用和`%s`、`%d`等不同,是将已打印的字符串的长度返回到该标签对应的变量中。在正常情况下的使用不会出现什么问题:
|
||||
|
||||
```C
|
||||
```c
|
||||
printf("abcd%n",&num);
|
||||
//输出abcd,并且num的值为4
|
||||
```
|
||||
|
||||
但如果在编写代码时忘记 format 字符串:
|
||||
|
||||
```C
|
||||
```c
|
||||
printf(something_want_print);
|
||||
```
|
||||
|
||||
此时若攻击者可以自定义该字符串,就可以使用`%d`、`%p`、`%s`等打印栈上数据,或者`%n`来覆写栈上的数据,如果覆写了返回地址,就可以实现任意代码执行。
|
||||
|
||||
```C
|
||||
```c
|
||||
char ch[20];
|
||||
scanf("%s",ch);// 输入 %d%n%n%n%n%n
|
||||
printf(ch);
|
||||
|
||||
Reference in New Issue
Block a user