• 栈溢出2017doubly_dangerous


     IDA打开,发现gets漏洞函数。可以观察到,只要让v5等于11.28125即可获得flag。问题是这里并没有输入v5的语句。

    再看第3,4行,发现变量s和v5都是保存在栈中,并且s是用gets来赋值的。

    所以到这里思路就很清晰了,用gets漏洞覆盖掉原本是存放v5的栈帧,让v5等于11.28125,就可以拿到flag了.

    IDA中显示s存放在ebp-4c位置,v5存放在ebp-c的位置。它俩之间差40h,因此需要40h的填充数据。

     pwngdb进行调试,在执行过add指令后暂停,显然这里的gets是cdcall约定,处理栈交给调用函数,只有执行完这条语句后,gets函数才算是结束,当前栈才是main函数的栈。

    我这里输入的数据是0123456789012345678901234567890123456789012345678901234567890123AAAA,40h个数字加4个A。

     当前EBP是0x88

     在进行比较时,是用的ebp-0xc(即0x7c)的栈帧来比较的。

     观察栈帧,发现输入的40h+4的数据,确实成功填充掉了0x7c的这个位置。

    也就证明了,IDA中显示的正确,并且40h+4的填充数据是正确的。

    然后的问题就是,这个二进制数据是多少的时候,才能够让v5等于11.28125呢。

    在这里可以看到,汇编指令读取了内存中0x804876c处的数据。

     可以用  x/4xb 0x804876c来读取这个地方的数据。因为是小端序,所以正确的值应该为0x41348000。

    当然这个值也可以通过计算得出,也可以自己写个c语言程序(上图为VC中得出的结果),转汇编后得出。

    from pwn import *
    io=process('./doubly_dangerous')
    payload=b'A'*64+p32(0x41348000)
    print(io.recv())
    io.sendline(payload)
    print(io.recv())

  • 相关阅读:
    WINCE6.0+S3C6410睡眠和唤醒的实现
    WINCE6.0+S3C6410的触摸屏驱动
    S3C6410的Bootloader的两个阶段BL1和BL2编译相关学习
    amix vim vimrc 3.6 [_vimrc x64 vim (WorkPlace)]配置
    异常的开销
    A C# Reading List by Eric Lippert (ZZ)
    SQL SERVER 2008中定时备份数据库任务的创建与删除
    ASP.NET26个常用性能优化方法
    如何使用四个语句来提高 SQL Server 的伸缩性
    Cookies揭秘 [Asp.Net, Javascript]
  • 原文地址:https://www.cnblogs.com/sweetbaby/p/14084672.html
Copyright © 2020-2023  润新知