美文网首页
pwnable.tw wp

pwnable.tw wp

作者: fantasy_learner | 来源:发表于2018-12-15 11:17 被阅读0次

start

分析: ret2shellcode

流程:传入shellcode 并且执行

要点:

  • 1.得到溢出,劫持控制流,需要的偏移和可以利用得长度
    根据ida的反编译结果中 输入函数的代码可得, 实际最大输入字符数0x3c(60) ,程序预计最大输入长度0x14(20),所以需要的偏移是0x14 ,可以利用的长度是 0x3c - 0x14 (40)

  • 2.选择可以使用的shellcode
    shellcraft.sh() 生成的shellcode长度位41 超过了可以利用的长度,所以选择了另一个长度位21的shellcode

  • 3.获取shellcode的地址
    因为gdb调试的结果中栈地址不断变化,所以不能采用蒸米教程中的内存溢出,并用gdb分析结果文件的办法获取shellcode地址。并且因为该题中有 push esp 将栈地址保存入栈中 和 sys_write(1 , esp , 0x14) 输出栈顶值得函数调用,因而选择在程序中泄露栈地址 , 然后推算shellcode地址
    tip: 获得的esp地址 是 push esp 之前的 栈顶地址 , 所以 当前栈顶地址为获取的esp地址 - 4 , 所以 addr_shellcode地址 = (addr_esp - 4 ) + 0x14 + 4 = addr_esp + 0x14

exp


orw

  • file :32位 程序
  • checksec : statck canary
  • 题目提示 : Read the flag from /home/orw/flag. Only open read write syscall are allowed to use.(即 在只允许使用open read write 的条件下 获取 flag )
  • 分析过程 :运行可以看到 give me your shellcode ,结合 ida 反汇编的结果确认, 该程序会直接执行输入的shellcode
  • 考点 : 手动编写shellcode的能力
  • 额外知识 :
    1. 限制可以使用的syscall 的方式 , seccomp 是一种__ linux kernel __从 2.6.23 版本开始所支持的一种安全机制。主要功能是限制系统调用。
    1. syscall 的传参方式 , 32 位下 eax 为系统调用号 , ebx , ecx , edx 依次为参数 1 , 2 , 3 (c 中 从左向右) , 64位 rax 为 系统调用号 , 其余传参 顺序从左向右 , rdi rsi rdx rcx r8 r9 . | 03 read , 04 write , 05 open
    1. 输入字符串一定要加 \x00 来标识字符串结尾
      exp

calc

  • 文件信息:
    - 静态链接
    - nx | canary
    - elf文件中 无 system函数 和 "/bin/sh\x00"
  • 功能 :计算器 计算输入的表达式
  • 详细流程 :
      1. 过滤输入 | 只允许 + - * / % 和 数字进入
      1. 初始化数字栈
      1. 处理表达式
        • 3.1 检测到非数字(操作符)后 将 操作符前的字符串 (input_str[ last_pos : now]) 转化为数字存储进数字栈
        • 3.2 检测该数字是否为0 (防止 divison by 0)
        • 3.3 检测操作符 下一个字符是否是数字 (防止连续使用多个操作符)
        • 3.4 检测操作符栈是否有值
          - 3.4.1 无 | 将当前操作符压入栈
          - 3.4.2 有 | 判断操作符优先级
          - 3.4.2.1 当前操作符优先级高于栈顶操作符 | 将 当前操作符压入栈
          - 3.4.2.2 当前操作符优先级 <= | 执行栈顶操作符 并将当前操作符压入栈
          - 3.4.2.3 default | 执行栈顶操作符
    • 漏洞点 :

      • 执行操作符时未检测数字栈中是否有数字 , 如果第一个数字不填入,就可以手动改写数字栈的索引值 , 从而造成栈上相对地址的任意读写

      漏洞代码 ida 伪代码 如下图:

      image.png
  • 漏洞利用思路:
    • 因为 题目文件 是 静态链接 且 没有 system函数 和 "/bin/sh\x00" , 所以考虑 使用syscall | ret2syscall
    • 调用read 输入 /bin/sh\x00 ,并执行 execve("/bin/sh\x00" , null , null) 从而 getshell

exp


dubblesort

  • 这道题目基本都是参考大佬们的wp做出来的,学习到了不少
    • 参考wp
      1. scanf("%u") 输入不合规 时 可以不修改目标地址的值 ,处理输出不当会造成泄露
      • 不合规输入 "+" "-" 会不修改并泄露 | 本题使用了 fflush 处理了输出,所以没有泄露
      • 不合规输入 如 "ab " 会占用输入缓冲区(会阻碍其他scanf的执行),直到 正确处理了这个输入
      1. 栈中 libc相对地址 与 libc_base 的偏移和 libc的版本有关 | readelf -S 查看段偏移
      1. one_gadget可能全都不适用
      1. 如果本地运行的栈相关值和远程运行的不同,记得在所有需要的地方做出调整 | 本地 一个溢出的填充 和远程不同 让我多看了一个小时。。。
  • 功能 :
    • 输入指定数量个数字 , 排序并输入 (小 -> 大)
  • 漏洞点
    • 输入的数字数量不限制造成栈溢出
    • name的输入未加结尾符导致 leak
    • scanf(“%u”) 通过 "+" 的输入可以不修改目标地址的值造成 绕过canary
  • 利用过程
      1. 利用 name leak处 libc的相关地址,从而获取 system 和 "/bin/sh\x00" 的地址
      1. 利用 scanf("%u") 的点 绕过 canary
      1. 利用 输入的数字 覆盖 ret地址 之后的值 来执行 system("/bin/sh\x00") getshell

exp

相关文章

网友评论

      本文标题:pwnable.tw wp

      本文链接:https://www.haomeiwen.com/subject/eeoohqtx.html