缓冲区溢出学习笔记

2007-12-5 Nie.Meining Debug

一、溢出改写main返回地址:

#include<stdio.h>

#include<stdlib.h>

void why_here(void)

{

    printf("It's a test!\n");

    exit(0);

}

int main(int argc,char * argv[])

{

    int buff[1];

    buff[2]=(int)why_here;

    return 0;

}


 二、非常规方法实现两数相加:

#include<stdio.h>

#include<stdlib.h>

typedef int (* PF)(int,int);

int main(void)

{

    unsigned char buff[256];

    for(int i=0;i!=11;i++)

        scanf("\\x%x",&buff[i]);

    PF pf=(PF)buff;

    int result=0;

    int a,b;

    scanf("%d %d",&a,&b);

    result=pf(a,b);

    printf("result=%i\n",result);

    system("pause");

    return 0;

}

 

输入格式:

\x55\x89\xe5\x8b\x45\x0c\x03\x45\x08\x5d\xc3

第一个数 第二个数

以下程序取得exp:

#include <stdio.h>

#include <stdlib.h>

int add(int x,int y)

{

     return x+y;

}

typedef int (* PF)(int,int);

int main(void)

{

     unsigned char buff[256];

     unsigned char *ps=(unsigned char *)&add;

     unsigned char *pd=buff;

     int result=0;

     PF pf=(PF)buff;

     while(1)

     {

          *pd=*ps;

          printf("\\x%02x",*ps);

          if(*ps==0xc3)

          {

               break;

          }

           pd++,ps++;

      }

      result=pf(129,127);

     printf("\nresult=%i\n",result);

     system("pause");

     return 0;

}

 

三、溢出改变执行函数

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int add(int x,int y)

{

    return x+y;

}

int mul(int x,int y)

{

    return x*y;

}

typedef int (* PF)(int,int);

int main(int argc,char *argv[])

{

    PF pf;

    char buff[4];

    int t=0;

    pf=(PF) &mul;

    if(argc >1)

    {

        memcpy(buff,argv[1],8);

    }

    t=pf(4,8);

    printf("4+8=%i\n",t);

    system("pause");

}

 

exp依具体情况而定,本机为:\x61\x61\x61\x61\x90\x12\x40\x00

一、栈溢出(JMP esp法):
将栈顶覆盖为JMP esp指令的地址,后面跟ShellCode或跳转到ShellCode的指令,eip出栈后esp指向ShellCode,而eip刚好指向跳转到ShellCode的指令(巧妙!)
1、精确定位返回点(求余取整法可巧妙定位)
2、编写ShellCode
3、JMP esp的地址(中文通用地址:0x7ffa4512)

二、覆盖异常(JMP/CALL ebx法):
将错误入口处覆盖为JMP ebx(入口前4个字节处),再JMP 04,越过覆盖值,到达ShellCode,实现接管异常。
1、取得异常入口的正确位置
2、编写ShellCode
3、JMP ebx的地址(通用地址:0x7ffa1571)

发表评论:

Powered by emlog