本文已参与「新人创作礼」活动,一起开启掘金创作之路
还是来自于BUUCTF的机器,今天的很简单,就是单纯的考察了read函数的漏洞,以及对64位寄存器的理解
开始
首先还是经典查壳和内存保护,发现啥也没有,是很简单的机器。然后IDA反编译一下,由于是64位的软件所以需要IDA64
main函数
首先可以看到主函数中知识调用了write函数,并输出了Hello, Worldn这么几个字到终端。
之后调用了vulnerable_function函数
因为反汇编并不会给出类似于write这种函数的定义,
所以需要熟悉汇编的同学自行根据效果来判断各寄存器中值的作用。
edx是控制输出字符的长度
esi则是源字符串的标志地址
edi是输出的位置,大家可能比较熟悉 C://file.txt这种形式,这里的1表示输出到终端
Vulnerable_Function函数
此处是漏洞函数,看上去read做了长度限制,但其实一点用也没有
可以在最上面看到buf定义的段是0-80h这么一段,而read最大长度给到了200h,所以可以造成栈溢出,执行任意函数。
内存摆放顺序
思路
那么思路就是覆盖0-80h这一段的位置再覆盖rbp的位置,最后在返回处放上想执行的函数就可以了
需要的长度是
80h(栈长度)+8(64位寄存器长度)+ 4 (返回地址)=8Ch < 200h
但由于开启了NX able,导致我们不能自己写入回连脚本,只能找一个官方后门
可以执行的函数
callsystem函数
很简单的调用了系统的shell拿到他的偏移地址 400596就可以开始布置exp了
结束
按照上面的思路,可以简单的使用pwntools构造出一个简单的exp
from pwn import *
p = remote('node4.buuoj.cn','28207')
payload = "I" * 128 +"AAAAAAAA" + p64(0x400596)
p.sendline(payload)
p.interactive()
初学者,写的有什么不对还请读者朋友不吝赐教。