Differences between revisions 1 and 2
Revision 1 as of 2005-01-21 17:29:25
Size: 1775
Editor: 222
Comment:
Revision 2 as of 2005-01-21 17:38:47
Size: 2188
Editor: 222
Comment:
Deletions are marked like this. Additions are marked like this.
Line 25: Line 25:
  代码是最好的教程!   1, 关于EIP: 存放进程下一步指令的地址.
代码是最好的教程!
Line 43: Line 44:

** 关于栈 **
  1, 定义
  相对于进程本身来说,栈就是存放了进程的除了由malloc分配外的局部变量的一段内存,其采取FIlO(FIRST IN LAST OUT)原则,
  ELF程序内对子函数的调用大都是这样一个过程: 当需要调用一个子函数时,当前进程讲函数返回后将要执行的指令地址压入栈

标 题: 谁动了我的EIP 作 者: riverfor <mailto: [email protected]> 日 期: 2005-1-22 关键词: stack, shellcode 内 容;

  • 1 -- 简介
    • 1, EIP
    2 -- 关于栈
    • 1, 栈的定义 2, 不同的栈的结构变化
    3 -- 关于shellcode
    • 1, shellcode的定义 2, 怎样写出一个基本的shellcode 3, 怎样写出一个特殊的shellcode
    4 -- 改变EIP
    • 1, 直接法 2, 间接法
    5 -- 参考文献

写在前面的前面

  • 我是一个Linux fan, 本文所讲述的系统为X86架构上的Linux, 我用的linux为Redhat ES 和 knoppix, 使用的gcc都是Version3.2, 本文的例子都是基于此. 同时,我又是一个初学者,所以本文的思想都体现的是我对我所找到的相关文档的理解, 写下这片文章的目的除了以文档的形式总结一下自己所学的东西,同时在看国内前辈的文章时,感觉到前辈们虽然很理解Stack overflow,但是没有全面地讲述出来,我才艺不精,但自认文笔清晰,谨以此文献给广大Linux初级爱好者,也感谢高手们斧正。 本文的例子中,注释带[paltform]表示不同的Linux发行版或编译器,可能需要改变

** 简介 **

  • 1, 关于EIP: 存放进程下一步指令的地址.

代码是最好的教程!

  • int *ret;

    ret = (int *)&ret + 2; // [paltform] (*ret) += 7; // [paltform]

} int main() {

  • int x = 0; ch_eip(); x = 1; print("x = %d\n", x);

}

  • 为什么结果是x = 0? 我们在调用ch_eip的时候,改变了它生存时产生的Stack里存放的eip, 使得我们的函数返回时跳过了x = 1这一步,所以我们的结果是x = 0. ch_eip动了我们的eip.

** 关于栈 **

  • 1, 定义 相对于进程本身来说,栈就是存放了进程的除了由malloc分配外的局部变量的一段内存,其采取FIlO(FIRST IN LAST OUT)原则, ELF程序内对子函数的调用大都是这样一个过程: 当需要调用一个子函数时,当前进程讲函数返回后将要执行的指令地址压入栈

eip (last edited 2009-12-25 07:12:55 by localhost)