学长说,欸👆🤗,要不你们周日来我这里吃个饭,然后。。。光注意有饭吃没注意到学长让我们带电脑,也就是说——做题,还好不难,学到一些东西,嘻嘻
分析
保护 main函数和菜单,我们要使uid为0同时账户为roo才能获取shell sign_up和sign_in的逻辑大致理解后,我们要尝试还原结构体 否则我们无法彻底理解用户和用户组成链表之间的关系 shift+f1进入结构体界面后,按下insert创建结构体,我们根据反编译逻辑进行构建,分别有两个结构体,一个是用户结构体,一个是连接各用户的链表结构体:
|
|
逆向后
欸,我们发现一开始就有了一个root用户的节点,但很遗憾,无论如何我们都不可能用普通的手段使得uid为0的同时还存在一个节点,先看看逆完后其他函数的逻辑 观察上面三个函数,我们发现!ptr虽然释放掉了当前节点的指针和user,但是我在sign_up的时候,v4又把这个节点的指针分配回来了! 所以我们是否可以利用一些小手段,在申请的时候使其指向一个fake_user后使得这个user的UID就是0!这样我们在sign_up一个用户后sign_in时只要不空根据程序会从头遍历到尾去寻找对应的用户登录,在这个时候登录我们这个fake_user,那么就会直接system(/bin/sh)! vmmap查看后我们决定在rodata区域中寻找一个可以作为fake_user的部分(你不可能在text这个饱和的代码段里找) 有了!这个地址处会通过0x40e3b8作为userlist的地址,然后0x4003d8就是user的地址,在这个user中UID就是0! 我们继续跟进查看,username和password都是0,那么就可以开始着手编写exp了!exp
|
|
代码得多写写才行啊!