-
-
[原创]pwn中one_gadget的使用技巧
-
发表于:
2020-8-1 11:12
16122
-
很多新手在栈溢出的时候会手动输入/bin/sh地址和system等函数的地址,这样不仅麻烦而且很容易出错。其实libc中带有很多gadget,控制程序跳转到这些位置执行并满足一定的条件就可以拿到shell。
最常见的用法是one_gadget后面跟libc文件,就可以拿到one_gadget的地址了,上图我以libc 2.27为例,这里有一个小技巧,就是可以看到one_gadget是需要满足一定条件的,这里我认为最好满足的是 rsp+0x40==NULL 这个条件,要求栈上的这个位置为null,这里随便拿一个程序来看一下。我在返回地址处填充了0x4f3c2这个gadget。
然后跟进去运行, ,发现程序将rsp+0x40赋值给了rsi,那么显然这个值是需要是null的,这也跟刚才one_gadget给我们提示的满足条件相符合。看一下这个值,
这个值并不是null,这样的话运行下去显然是会出错的,修改这个值显然也很麻烦,但是我们可以观察到0x7fffb5b9e0d0 + 0x60是null,符合我们的要求,而且刚才溢出的时候我们是可以控制rsp的,我们可以在输入one_gadget之前多个ret指令的addr,这样就可以增加rsp的值了。修改后的payload如下
此时
这样就可以满足我们的要求了
后面加-l2参数可以找到更多的gadget。
另外还有一个near功能也很管用,可以找最靠近某个函数的gadget,这里我以libc 2.23为例。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-8-1 14:06
被Mr.Bean编辑
,原因: 刚才图片挂了