-
-
[旧帖]
[分享]最简单覆盖ret,我的学习心得
0.00雪花
-
发表于:
2008-7-17 16:47
4241
-
[旧帖] [分享]最简单覆盖ret,我的学习心得
0.00雪花
刚刚实验了第一个BufferOverflow Code,虽然非常简单,但是感觉自己还是收获了许多的知识,要赶快记录下来啊!子Function中的ret即使主调Function中的eip,在子 Function Return时将根据ret的值恢复eip,所以可以覆盖ret来实现跳转Program的Run!
c language code:
#include <stdio.h>
#include <string.h>
void function(char *pointer)
{
char buffer[2]; //2 byte
strcpy(buffer,pointer);
}
int main(void)
{
char overflow_str[]="aaaa";
function(overflow_str);
printf("hello liquidworm\n");
return 0;
}
在子Function被Call时,要负责完成以下事情:
1 按照从又至左的顺序吧参数入Stack
2 将当前eip入Stack为ret
此时控制权将友子Function接管,并且完成以下事情:
1 将当前ebp入Stack,以Save主调Function的Stack界限
2 将esp copy to ebp以重新设定子Function Stack界限
3 esp - 特定值,以为局部变量预留空间
上面code中Function被Call时,Stack结构如下:
|buffer | <-2 byte
|ebp | <-1 byte
|ret | <- 1 byte
|pointer |
-----------
所以当填充4个byte时将覆盖ret,当子Function Return时,将会发生Error.
这里值得强调的是,也是我刚刚迷惑的地方就是:Buffer的生长方向是从低地址到高地址,而Stack的生长方向是从高地址到底地址,我之前忘记了这一点,当我问别人的时候才明白,所以Debug以后验证了这一点。由于偶还是只小小小鸟,所以还不知道怎么看code的address,所以没办法转移到指定code处,我会加油的。
如果以上存在error,还请高手客气的给予指正,尤其是那些步骤,我自己也不肯定!!
[课程]Linux pwn 探索篇!