<commit_before>---
layout: post
title: linux下栈溢出介绍
date: 2016-03-31
categories:
- Linux
- Funny
tags: [Funny]
status: publish
type: post
published: true
author:
  login: slayer
  email: <EMAIL>
  display_name: slayer
---

去年偶然看到一本书，讨论了一些常见漏洞，挺有意思的一本书，不是讲找漏洞，而是写漏洞。比起那种千篇一律，教人使用各种工具找漏洞的书，这种书才是从根本出发，也越容易让人接受。

从书中学到了很多，下面结合例子，介绍一下栈溢出漏洞(本文的实验测试全部是在ubuntu 14.04下完成， 不同操作系统可能不一样)。

### 什么是栈溢出
栈溢出，其实就是使用了不该使用的内存，在写入缓冲区的时候，如果忘记检查，就会出现溢出的问题。

### 模拟栈溢出漏洞

看一个C语言的例子，我们知道函数里面的变量会存储在栈里面，我们写一个检查权限的函数：

~~~c

    int check_authentication(char *password)
    {
        int auth_flag = 0;  //存储在栈中
        char password_buffer[12]; //存储在栈中，用来缓冲传进来的password<commit_msg>update the title of the post about stack overflow<commit_after>---
layout: post
title: 栈溢出的原理和如何利用
date: 2016-03-31
categories:
- Linux
- Funny
tags: [Funny]
status: publish
type: post
published: true
author:
  login: slayer
  email: <EMAIL>
  display_name: slayer
---

去年偶然看到一本书，讨论了一些常见漏洞，挺有意思的一本书，不是讲找漏洞，而是写漏洞。比起那种千篇一律，教人使用各种工具找漏洞的书，这种书才是从根本出发，也越容易让人接受。

从书中学到了很多，下面结合例子，介绍一下栈溢出漏洞(本文的实验测试全部是在ubuntu 14.04下完成， 不同操作系统可能不一样)。

### 什么是栈溢出
栈溢出，其实就是使用了不该使用的内存，在写入缓冲区的时候，如果忘记检查，就会出现溢出的问题。

### 模拟栈溢出漏洞

看一个C语言的例子，我们知道函数里面的变量会存储在栈里面，我们写一个检查权限的函数：

~~~c

    int check_authentication(char *password)
    {
        int auth_flag = 0;  //存储在栈中
        char password_buffer[12]; //存储在栈中，用来缓冲传进来的password
{'fraction_non_alphanumeric': 0.11259259259259259, 'fraction_numerical': 0.022222222222222223, 'mean_word_length': 5.283720930232558, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2552438', 'n_tokens_mistral': 919, 'n_tokens_neox': 979, 'n_words': 95}