缓冲区溢出2

首先介绍一下puts函数 ,从缓冲区读取一段内容打印到屏幕!

每次用到puts函数的时候会有 mov xxxxx,(%esp)我觉得这种输出格式应该满足大部分格式(输出的内容是esp指向的内容)(print函数也是)

接下来要介绍一个strcpy函数,下面是引用的一段百度百科

原型声明:char *strcpy(char* dest, const char *src);
头文件:#include < string.h> 和 #include <stdio.h>
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的 地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的 指针

实际上这里所说的空间大部分是在堆栈中的

好了 进入正题
#include<stdio.h>
#incldue<string.h>
int main(int argc,char ** argv)
{
    int modiafied;
    char buffer[64];
    if(argc==1)
    {
        print ("please specify an argument\n");
        exit(1);
    }
    modified=0;
    strcpy(buffer,argv[1]);
    if(modified=0x61626364)
    {
         printf("Congratulation,you pwned it\n");
    }
    else
    {
        printf("Please try again,you got 0x%08X\n,modified");
    }
    return 0;
}
上面是源代码

编译后用gdb执行

这里很显然 传参数的时候首选寄存器是esp之前我看的书上

写的gcc编译器使用寄存器顺序是rdi,rsi,rdx,rcx,r8,r9应该和编译器有关吧


<+6>这里也是为堆栈分配了0x60个字节空间(这应该是一种编译器习惯吧)

<+9>这里是判断命令行传入参数个数是否为1(ebp+8)(命令行参数为1说明没有传进来参数)

<+15,+20>这两句可以看出,puts输出的是esp处的内容,puts之前对esp传值

exit传进去的值是1

<+39>参数个数不是1说明传入参数,modified变量的值位于esp+5C=0  (存放位置同上一篇一样,都是接近栈顶的地方)

<+47>跟下面这个上一篇里的图比较(下图的0x5c-0x1c才是栈空间中的数组)这里的ebp+c是之前把argv数组存放的地址

<+50>传入参数的时候,系统会默认一个argv[0]=文件名这里+4让argv除去系统默认生成的(+4能除掉说明堆栈中存放的是32位的地址)

<+53>取argv[1]的值,执行完这一句eax里面是指向argv[1]的地址

<+55>把argv[1]的地址给esp+4(现在argv[1]就是argv数组的起始地址) 也就是strcpy函数的第二个参数

<+59>buffer数组的起始地址为esp+0x1C

<+63>eax作为中间量把数据拷贝到esp   从这里看strcpy函数是靠堆栈来传递参数的(先传递第二个参数后传递第一个),这里用堆栈传递而不用寄存器传递参数的原因看下面

<+71>判断esp+0x5C处是否为0x61626364


补充:局部数据必须放在内存中的常见情况:

1.寄存器不足够存放所有的本地数据

2.对某个局部变量使用取地址运算符&,因此必须为它 产生一个地址

3.某些局部变量是数组或结构,必须通过数组或结构的引用访问到

还有一点,程序大端和小端存储方式是不一样的这里应该输入64个a+dcba才行(不能是abcd在每4个字节里按小端的存储方法,以4个字节为单位看的话存储顺序是正常的)


r 输入内容  让程序跑起来中断在断点处

x /4xb $esp+0x5c   (4表示长度单位,x表示16进制,b表示单位为字节)

c          断点断下来后的程序继续执行(continue)


test是可执行文件

./test xxx xxx xxx     test执行,test作为输入的第一个,xxx为后面的参数

xargs可以把数据当作命令行参数传给制定的程序:

python -c "print  'AAA BBB CCC'"|xargs ./test

python -c "print 'A'*64+'\x64\x63\x62\x61'"|xargs ./pwn2  没错,就是你猜的,传进去参数64个A+bcda (づ ̄ 3 ̄)づ

python -c "print  'A'*64+'dcba'" |xargs ./pwn2




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LogonUI缓冲区溢出是一种计算机安全漏洞,指的是在Windows系统登录界面(LogonUI)中,由于缺乏有效的输入验证措施,导致恶意用户能够向缓冲区内注入超出其分配空间的数据,从而造成系统崩溃或者远程攻击的风险。 缓冲区溢出的原因主要是由于程序员在编写代码时未正确考虑到输入的数据长度,导致输入数据超出了预分配的缓冲区空间。攻击者可以利用这一漏洞,向缓冲区注入恶意代码,从而执行远程攻击、篡改程序行为或窃取敏感信息等恶意行为。 为了防止LogonUI缓冲区溢出,开发人员应采取以下措施: 1. 输入验证:在接收用户输入数据时进行验证,确保输入数据的长度不超过预分配的缓冲区空间,避免缓冲区溢出。 2. 使用安全的API函数:使用安全的API函数来代替不安全的函数,这些安全API函数在处理缓冲区时会自动检查缓冲区边界,减少缓冲区溢出的风险。 3. 安全编程实践:开发人员应掌握安全编程实践并遵循最佳实践,如避免使用已知的不安全函数、特殊字符过滤、最小化权限等,以提高代码的安全性。 4. 及时修补漏洞:及时更新操作系统和应用程序的安全补丁,以修复已知的漏洞并提高系统的安全性。 总之,要防止LogonUI缓冲区溢出漏洞的发生,开发人员应积极优化代码、加强输入验证、使用安全的API函数,并及时修补漏洞。同时,用户也应定期更新系统和应用程序,增强系统的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值