前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pwnable.tw刷题之Silverbullet破解过程分享

Pwnable.tw刷题之Silverbullet破解过程分享

作者头像
FB客服
发布2018-03-22 15:41:29
1.4K0
发布2018-03-22 15:41:29
举报
文章被收录于专栏:FreeBufFreeBufFreeBuf

0x00背景介绍

之前加了学校的ctf社团之后开始学习binary方面的知识,跟着教程走完一遍之后学长推荐了pwnable来刷题,这篇文章就是pwnable上silverbullet的详细破解过程。

0x01程序分析

1. main 函数

可以看到程序并没有开启canary, 所以就考虑是否有栈溢出漏洞

2. create_bullet:

可以看到存储输入的字符串长度的变量就在存储输入字符的48个字节的后面一个字节.

3.power_up:

char strncat(char dest, const char*src, size_t n);

DESCRIPTION: strncat函数将src字符串最多前n字节添加到dest字符串的末尾(从dest原来末尾的’\x00’开始), 并在添加结束后在末尾补上一个’\x00’

经过上面的分析, 我们可以简单地把main函数的栈结构画出来如下, 方便后面分析

0x02 漏洞分析

如果我们先用create_bullet添加40个字节的字符串,

此时字符串长度处的数据为 \x1E\x00\x00\x00(小端序低位存储在地地址处)

再用power_up添加8个字节的字符串, 我们结合power_up代码分析

` if ( ((_DWORD )dest + 12) > 0x2Fu ) ##字符串长度若大于47则不能power_up

return puts(“You can’t power up any more !”);

此时*((_DWORD *)dest + 12 等于 40, 小于0x2f, 然后会调用read_input函数读取8个字节

read_input(&buf, 48 - *((_DWORD *)dest + 12));

再调用strncat拼接两个字符串

strncat(dest, &buf, 48 - *((_DWORD *)dest + 12));

漏洞就发生了, 因为strncat()会在拼接完的字符串后面添加一个’\x00’, 于是字符串长度的第一个字节就被覆盖成了’\x00’, 字符串长度就变成了0

` v3 = strlen(&buf) + ((_DWORD )dest + 12); ##重新计算新的字符串的长度

printf(“Your new power is : %u\n”, v3);

((_DWORD )dest + 12) = v3; ##更新字符串长度

再更新之后字符串长度就变成了8, 于是我们可以在此使用power_up函数了~这次最多可以添加40个字节的数据, 完全足够覆盖main函数的ret地址了.

于是现在的思路就是通过栈溢出泄露libc中某个函数的地址(我选择的是read()), 然后根据题目提供的libc获得system和”/bin/sh”的地址, 最后调用system(“/bin/sh”), get_shell之后就拿到flag啦~

在调用strncat之后原来的储存的长度(40)就会被清零, 而函数结束后会变成8, 又可以在后面继续添加了, 于是就可以利用栈溢出覆盖ret地址而得到libc中函数的地址, 进而通过提供的libc得到system的地址和”/bin/sh”的地址, 从而get shell

1. 首先想办法泄露libc地址

我通过栈溢出将main函数deret地址修改为puts的plt地址调用()puts来输出got中read的地址, 从而得到libc中read的地址. 覆盖后栈空间大致如下

而puts()的返回地址被覆盖为main函数的初始地址, 所以拿到libc中read()的地址后又会重新运行main函数, 这次就可以利用的到的libc地址计算出system()和”/bin/sh”的真实地址再次覆盖返回地址调用system(“/bin/sh”)get shell了。

0x03 exp

exp如下:

0x04 收获

1. 本机调试的时候libc用的是/lib32/libc.so.6 2. 寻找libc中的”/bin/sh”时先是用ida中的string, 但是没找到. 之后尝试了一下ROPgadget, 发现很强大, 找了了一个”/bin/sh”和一堆”sh” ROPgadget --binary "./libc.so.6" --string "/bin/sh" 3. 经大佬提醒, 不一定非要”/bin/sh”, “sh”也行, 而且还有$0这种方法, 可能类似格式化字符串, 不过也没找到资料. 有空可以做一下实验, 学习了.

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00背景介绍
  • 0x01程序分析
    • 1. main 函数
      • 2. create_bullet:
        • 3.power_up:
        • 0x02 漏洞分析
          • 1. 首先想办法泄露libc地址
          • 0x03 exp
            • exp如下:
            • 0x04 收获
            相关产品与服务
            腾讯云代码分析
            腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档