搜索
    Hi~登录注册
    查看: 326|回复: 0
    收起左侧

    sctf_2016

    [复制链接]

    17

    主题

    3

    精华

    77 小时

    在线时间

    荣誉会员

    Rank: 8Rank: 8

    积分
    58
    发表于 2019-12-8 17:43:23 | 显示全部楼层 |阅读模式

    这里拿一个简单栈溢出binary 用于输入字符串所在空间偏移大小的分析

    由于对汇编掌握还不够深入,及时对知识点总结就比较重要了。

    0x1 运行binary查看基本流程及保护 10.png binary是32位的ELF文件,保护只开启了NX,流程来看大概是输入一个字符出会反回你输入的内容。在结合随后的静态分析发现当输入''I时会返回'you'。。 11.png 与此同时发现使用fgets函数接收字符串儿时限制的输入长度最大为32以内。

    0x2 分析输入字符串在栈中的偏移 这里先使用ida查看程序功能模块所在的代码段: 12.png

    在这里可以看到输入的字符串是通过相对于esp的索引,需要进行调试,将断点下在_fgets call 处。接下来使用gdb动态调试: 13.png

    流程是先下断 b* 0x080491d9 ---> 运行程序 r ---> 单步至输入字符串。 过程中进行分析。 在这里,lea eax, [ebp - 0x3c] 是把 ebp - 0x3c 这个地址里面保存的内容拿出来给 eax
    mov dword ptr [esp], eax 是把 eax 里面的内容拿出来给 esp 指向的地址 读入的字符串儿存储在以ebp+s 为首地址的地方 用于分配储存字符串的大小 相对于ebp 有0x3c 的偏移,理论上这里储存数据的的栈空间最大为0x3c 因而在32位binary中造成栈溢出需要0x3c+4的长度。

    0x3 构造溢出完成系统调用 在最初的静态分析中注意到fgets 函数限制了输入长度为32以内,显然不足以覆盖64个字符长度。但是程序只有这一个交互点。 这里可以利用输入字符串'I'程序转化为'you'这个条件来为我们构造出来足够长度的字符串儿 。因此构造'I'*21 在程序中相当于输入了63个字符。在加一个字符即可完成64位长度的覆盖。 14.png 在程序段可以找到系统指令调用地址。因而完成溢出后跳转这个地址即可。

    0x4 EXP 15.png

    16.png

    如有错误请多包涵❤️

    回复

    使用道具 举报

    游客
    回复
    您需要登录后才可以回帖 登录 | 获取账号

    快速回复 返回顶部 返回列表