pwnable
uaf
本题要用到cpp中虚函数表和的知识。每个对象都有一个虚拟表指针,而每个类有一个虚拟表,虚拟表中元素指向各个虚函数的起始地址。在一个对象中,第一个字段就是虚拟表指针,之后才是数据部分。通过IDA查看虚函数表,发现give_shell函数地址是虚表的第二个指针,而introduce是第三个指针,它们之间的地址差8,当我们执行introduce函数时,是根据对象的虚函数表加上函数名偏移量来确定函数首地址的,所以当我们修改对象的虚函数表地址则可通过偏移量的改变而执行其他函数,例如本题,要执行give_shell函数,只需将Man对象的虚函数表首地址-8,当我们执行introduce函数时,实际上执行的是give_shell函数。本题通过一个uaf漏洞使得我们可以对对象的内存数据进行覆盖,uaf即当我们delete一个对象之后new一个对象则会分配这块空间,本质上形成了一个悬挂指针,修改这部分内容并执行我们精心构造的数据内容,就完成了漏洞利用,在本例中,执行1次case3,再执行2次case2,即可将文件输入的数据分配到变量m中,将第一个字段覆盖为Man虚拟表首地址-8,再执行1次case1即可得到flag。
reversing
music player
解压后得到一个可执行播放器程序和它的dll文件,运行一下程序,是一个音乐播放器,放到一分钟就会停止播放,然后是一个弹窗。拖入IDA,发现程序的大部分执行是在dll文件中完成的,所以本题更适合动态分析,使用ollydbg,打开程序后,它是一个VB程序,所以弹窗API一般是rtcmsgbox函数,随便播放一首音乐放到59秒左右,在rtcmsgbox下断点后运行并走出,就可到达关键跳转附近。
向上看一看,就可看到关键跳转处
直接暴破,将jl改为jmp,发现程序运行到1分钟时出现另一错误弹框,但不点确定时,音乐会一直播放下去。且这个弹窗不是rtcmsgbox函数触发的,点确定后,整个窗口进程都退出了。为了了解最后发生了什么,我们在之前的关键跳处下断点,并将音乐播放放到59秒再运行,然后单步执行。可以看到在最后调用这个函数出现了问题,该函数可能是一个错误抛出之类的函数
而关键跳就是上方的jge,将其改为jmp就完成了暴破,这时,该程序窗口标题处会出现flag