buu——pwn学习
四、ciscn_2019_n_8
checksec一下
发现保护基本都开了,进入ida一探究竟:
达成条件很简单,就是让var[13]的值等于17就可以获取shell,这里要注意一点,var是int类型数组,所以填充的时候,比如var[0]就要填进去4个字节的内容才能填满(这里我刚开始疏忽了,一直没能获取权限。。)所以要是用a去填充要先填52个才行,之后才是输入17,不过如果直接使用p32会更方便一些,exp如下:
五、not_the_same_3dsctf_2016
查看一下开启了nx保护,以及一部分的relro,然后运行了一下,好像什么都没有。。拖入ida看看
好家伙,main函数里面的东西,以及函数窗口里面的情况让我想起了get_started_3dsctf_2016这题,似乎很像的样子
同样的不用覆盖ebp,直接就能到返回地址了,不清楚原理。。暂且不管吧,以后可能会看到的
这里有个函数,已经将flag的值读取并输入到了fl4g的位置,所以我们先用这个函数填充到返回地址处,把flag先读取到fl14为起始地址的内存中,接下来试着把这里的内容泄露出来,即可获取flag。所以我们需要write函数,并且因为write函数有三个参数,所以还需要pop 三个寄存器的指令进行清理栈,最后的p32(0)是pop中含着的ret操作,所以还需要再加一个返回地址,因为我们已经输出了flag,所以返回地址并不需要在意是哪,随便都可。具体exp如下:
六、[HarekazeCTF2019]baby_rop
只开启了nx和部分的relro保护机制,并且运行了没有多少的内容,很正常的内容回显。应该不会难的,嗯,先这么想。
进入ida看看,是不是跟想象的一样简单
的确如此,没有乱起名字。。确实是简单的rop,system函数和/bin/sh字符全都在,并且还有scanf的无限制输入,exp如下:
小插曲,我进入的时候,很惊讶的发现没有flag。。。不知道是管理员忘了,还是说哪个人做了不小心可能删了吧。。
七、jarvisoj_level2_x64
只开启了nx,运行一下,貌似也很简单的样子,预测可能跟32位的level2差不多吧,就是变到了64位的环境下,可能为了考验传参
做法跟上一题差不多吧,就不多放图片了,直接exp了:
八、ciscn_2019_n_5
好家伙,nx都没开启,可能要直接在栈上执行shellcode了
确实的,有个gets无限输入,很明显可以被利用的溢出点。不过后面带了个name有点奇怪,进入看看汇编是什么情况
好吧,应该是ida出错了一些,只有调用了text,那就直接进行覆盖吧。因为pwntools已经有着自带的shellcode注入了,(要是没有的话我也不会写了,哈哈哈)exp如下:
这里一开始是想直接就在栈上注入shellcode的,不过没能成功,可能是因为太长覆盖了一些其他信息了吧,所以就转移到bss上执行,在gdb中也能查看到bss也具有可执行性
九、ciscn_2019_ne_5
开启了nx和部分的relro缓解措施
进入ida按F5会反编译失败,只要进入到对应地址的scanf函数里面按F5对函数编译,再回到main函数即可反编译成功
首先把第一个密码绕过,输入administrator即可,当我们进入下面额print函数查看可以发现有system函数的调用,此时我们只需要再查找到参数和溢出点即可,往上看,调用了fflush函数,里面有sh字符串。这里有个点,sh字符串也可以成为system的函数获取到shell的权限。那么只剩下溢出点了。前面的scanf函数输入,都无法溢出。只有在Addlog里面的scanf函数可以覆盖,然后再去到函数4GetFlag里面
有个strcpy函数,可以把之前输入的src复制到dest中,造成溢出。exp如下:
exp还有个要注意的就是system后跟的返回地址不能写p32(0)这样的,因为这么写,scanf函数遇到’\x00’会停止读取,所以我这里选择直接写四个字符串