前几天我看到看雪的pwn板块,发现比较感兴趣,而且重这其中看到了一个练题的网站pwnable.kr,于是我就去练了一下,虽然很简单但是想和刚入门的新手们分享一下;
说一下此次的主要的利用思路:
通过welcome()函数写login()函数的passcode1的内容,修改printf的指针使函数调用printf时就会跳到我们想要的地址去执行程序,绕过判断语句,拿到flag;
进去网站打开passcod;
于是我们进入linux;输入ssh passcode@pwnable.kr -p2222
输入密码后我们查看下这里面的文件
我们看到以guest身份对flag没有任何的权限;所以我们查看passcode.c
我们看到scanf处没有加取地址符号(&),而且程序有没有对passcode1和passcode2 进行初始化;但看此时主函数中对welcome()和login()连续调用,这就隐含了它们的ebp是相同的;所以或许我们可以重这里利用;
我们用objdump -d passcode查看passcode这个可执行文件的汇编代码,这里我们主要看welcome()函数和login()函数的汇编
我们看到welcome()函数处的0x8048643处的代码,lea -0x70(%ebp),%edx;相当于edx=[ebp-0x70];冲这里我们知道name的地址是保存在ebp-0x70处;而在下图中0x8048586处的前3行处有mov -0x10(%ebp),%edx;可知passcod1在ebp-0x10处,因此在调用welcome处的字符串处我们输入(0x70-0x10)=96个字节,再覆盖四个字节就是passcode1的值,这里如果我们把passcode1的值覆盖为任意地址就可以实现任意地址写了;
这里我们将passcode1处的值写什么我们才能读到flag呢?
我们再看源代码
scanf("%d",passcode1)处的后两句又对printf调用,因此我们想能不能覆盖printf的地址呢,把printf的地址覆盖为printf("login ok!\n");处的地址就直接绕过了判断语句;我们看login()函数的反汇编可以看到这里的地址为0x80485d7;
接下来我们用objdump -R passcode查看printf的地址
我们看到printf的指针保存在0x804a000处,因此我们把这里的指针堵盖为0x80485d7(10进制为134514135) 就可以绕过了那个判读语句执行里面的代码了
接下来我们构造数据如下图,最后就能得到flag了;(由于scanf要的是%d,所以我们要输入10进制的134514135)
进去网站打开passcod;
于是我们进入linux;输入ssh passcode@pwnable.kr -p2222
输入密码后我们查看下这里面的文件
我们看到以guest身份对flag没有任何的权限;所以我们查看passcode.c
我们看到scanf处没有加取地址符号(&),而且程序有没有对passcode1和passcode2 进行初始化;但看此时主函数中对welcome()和login()连续调用,这就隐含了它们的ebp是相同的;所以或许我们可以重这里利用;
我们用objdump -d passcode查看passcode这个可执行文件的汇编代码,这里我们主要看welcome()函数和login()函数的汇编
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2020-4-13 20:18
被一只猪儿虫编辑
,原因: