pwnable.tw->babystack
前言
重新开始刷pwnable.tw,发现一年下来自己好像并没有什么长进。。做这里的题依然是举步维艰,记录一下这道折腾了三天的题QAQ。
程序逻辑
程序只有Login和Magic两个功能,只有Login过了check才能将0x202014置为1,进而可以使用Magic功能。
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
Login需要跟随机数比较,可以输入’\x00’+*绕过strncmp,进而使用Magic函数,但是后面发现这样绕不过最终的memcmp检查。
1 | int __fastcall Login(const char *buf) |
magic函数可以strcpy,漏洞基本就在这里了
1 | int __fastcall magic(char *des) |
漏洞利用
刚才的magic试过之后发现可以溢出rbp-rbp+0x1f,但是因为最后的memcmp检查会和mmap的地址里的随机数对比,我们需要得到最开始的0x10大小的canary。这里的方法就是刚刚不久用过的爆破,因为strncmp是按size长度比较的,我们可以以’\x00’为分割,逐字节爆破,同样地,观察之后可以发现Login里的比较用的是栈里的数据,后面跟着的就是stack有关的地址和程序相关地址,因此使用相同的方法爆破出这两个地址,最终使用gadgets调用get_input读取更大输入,泄露libc并获取shell。
这里卡了我很长时间的一点是截断,strcpy需要调用多次且下一次要清空高字节的非零字符,方能strcpy写入数据。
还有输入choice的地方输入’1’*8和’1’是一样的,这个在栈地址对应canary后面,在爆破code base的时候需要输入8个1来填充。
exp.py
1 | #coding=utf-8 |