首页
论坛
课程
招聘
[原创]pwnable.kr passcode
2018-11-24 16:34 10655

[原创]pwnable.kr passcode

2018-11-24 16:34
10655
            前几天我看到看雪的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)


[公告]《CTF高级解混淆》训练营,国际顶尖CTF战队大牛亲自授课,助你快速成长!

最后于 2020-4-13 20:18 被一只猪儿虫编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (4)
雪    币: 5131
活跃值: 活跃值 (6146)
能力值: (RANK:65 )
在线值:
发帖
回帖
粉丝
Editor 活跃值 2018-11-24 18:53
2
1
感谢分享!
雪    币: 288
活跃值: 活跃值 (26)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
一只猪儿虫 活跃值 2018-11-25 00:34
3
0
谢谢哈哈
雪    币: 374
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
zer0_1s 活跃值 2020-4-9 22:27
4
0
覆盖地址应该是0x80485d7吧?不是0x80495d7
雪    币: 288
活跃值: 活跃值 (26)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
一只猪儿虫 活跃值 2020-4-13 20:17
5
0
wx_@诺 覆盖地址应该是0x80485d7吧?不是0x80495d7
确实该是0x80485d7,应该是当时写错了
游客
登录 | 注册 方可回帖
返回