阅读本文需要的知识储备
- 了解C语言函数的概念
- 了解C语言指针的概念
什么是漏洞?漏洞会有什么危害?
暑假里小明(ctfer)今天去找小红玩耍,却发现刚高考完的小红居然在家自学C语言!沉溺于码代码的小红根本无暇搭理小明,为了搭讪小明无奈凑上前去,在屏幕上看到了如下代码:1
2
3
4
5
6
7
8
9
10
11
12
13
void success() { puts("You Hava already controlled it."); }
void vulnerable() {
char s[12];
gets(s);
puts(s);
return;
}
int main(int argc, char **argv) {
vulnerable();
return 0;
}
小红看着自己代码,志得意满的将自己的代码运行了,可是第三行的success函数并没有执行。呀!原来是自己的主函数里只调用了vulnerable函数,忘记调用success函数了。小红正准备修改自己的代码,却听见小明大喊一声,“慢着!我有办法让你不修改代码也能成功调用success函数。”只见小明一番操作,在小红怀疑的目光下,小明果真将success函数成功调用了。之间屏幕上出现了如下显示(linux界面)
1 | ➜ stack-example python exp.py |
第一行运行了攻击脚本
在第六行,”You Hava already controlled it.”,字符串被成功输出
小红顿生疑惑:“这是为什么呀,代码里并没有调用这个success函数,为什么你还能成功调用它?”
小明嘿嘿一笑:“因为你的代码里存在着缓冲区溢出漏洞!你看你代码第5行的char s[12]只给这个s分配了12字节的空间,但是你第6行的gets(s),可以没有长度限制的向s里面输入数据。超出6字节大小的数据就会覆盖到内存里其它区域的位置。别人利用这个漏洞,轻则可以调用想调用的函数,获取你程序里的其它数据,重则拿到你系统的操作权限。以后写代码的时候你可长点心吧!”
小红看向小明的眼神顿时充满了崇拜:“那么你能不能教教我怎么利用这种漏洞?”
小明心花怒放:“当然没有问题,其实这只是最基础的一种漏洞,其它漏洞还有很多很多。但是即使是最基础的漏洞,你也要学一些基础的技能,才能够很好的利用他们,这些技能有:
- 扎实的C语言功底,特别是链表和指针这一块,你对语言不够熟悉怎么能发现他们的漏洞是吧?
- 汇编基础语法(对重点语句call,leave,retn等要有较深的理解)重点对汇编层面的函数调用有较好理解。(平时我们的C语言程序都要先翻译成汇编语言然后再翻译成机器语言然后才能执行,因为计算机其实只认识由0和1组成的机器语言。而汇编语言可以比C语言更低一层,属于低级语言,所以可以反映出更多程序运行的细节,我们也就是通过这些细节来发现和利用漏洞的。)
- python基础语法。我们利用漏洞要用python写脚本进行攻击的呀!
- linux基本命令。因为linux比较简单,我们前期的漏洞挖掘和利用主要再linux环境下的,所以你最好装个虚拟机哦。
“哇,看起来要学好多东西,可是我还什么都不会呢,我该从何学起呀?”小红疑惑道。
“先把C语言基础打好,C语言基础打好以后推荐中国大学mooc上南京大学袁春风老师的慕课,《计算机系统基础》(建议新生观看一,二,五,六,七,八周的课程),这个课能帮你建立一个计算机系统观,对以后的学习很有好处,里面也有你所需要的汇编知识呢,你先学这些,学完以后随时找我!”,小明潇洒的摆了摆手。
其它补充资料:汇编语言(王爽),深入理解计算机系统。
“哇,那太好了!”小红说着依偎在了小明怀中,从此他们幸福的走在了一起。