无聊之余,想弄一下缓冲区溢出实验,之前一直听说这个,也没有亲自动手做一下,发现真正弄起来的时候还是没那么简单的,其实学到的东西还是不少的。特此记下学习的过程。
一、基础知识
这一部分主要是关于程序内存布局相关的知识,也涉及少量at&t汇编、gdb调试、gcc编译的知识。再次说明本人非科班出生,所以在有些问题上要比科班出身的要纠结得多,但职业生涯还长,只要慢慢学习,静下心来,总能把问题解决。并且,我坚信在未来我能成为一名合格的程序猿和安全攻城狮。好的,言归正传,说知识点;
1、at&t汇编
决定弄这个缓冲区实验之前,我还是花了10来天把汇编语言学习了一下,主要看的是王爽编写的《汇编语言》,其实选择这本书的原因不是因为它是什么圣经,而是觉得它薄。把这本汇编大致扫了一遍之后,开始干具体的实验细节,具体是参照的《Smashing The Stack For Fun And Profit》。曾近以为看懂一点8086汇编,应该很容易上手AT&T汇编,然而菜鸟发现自己想多了,还得变弄变查AT&T汇编语句。
AT&T汇编的细节不在这里解释,主要可以参看资料:相关资料及全部源代码这是后面我的源码下载地址,同时把资料上传了上去。但是,这里还是说一下几个特殊的语句,也就是我很费解的部分;
lea src ,add指令:手册是说的是传送地址,简单一句话,我没有理解,一个博文上写的很好:地址是:深入理解计算机系统(3.4)---算数与逻辑运算指令详解,我还是复述一下上面的内容:
lea 4(%edx,%ex,4),%eax和movl 4(%edx,%edx,4),%eax的区别: “假设%edx寄存器的值为x的话,那么lea 4(%edx,%ex,4),%eax这条指令的作用就是将 4 + x + 4x = 5x + 4赋给%eax寄存器。它和mov指令的区别就在于,假设是movl 4(%edx,%edx,4),%eax这个指令,它的作用是将内存地址为5x+4的内存区域的值赋给%eax寄存器,而leal指令只是将5x+4这个地址赋给目的操作数%eax而已,它并不对存储器进行引用的值的计算。”上面的博文中还有详尽的图文描述,为了方便,我一并摘下;假设执行指令之前,寄存器和存储器的状态如图1,则执行了movl 4(%edx,%edx,4),%eax后,寄存器和存储器的状态如图2,而执行了lea指令后