2019.7.24 64位程序libc泄露 x64_3

1.2019.7.24 64位程序libc泄露 x64_3_第1张图片这是程序,程序中没有system函数也没有/bin/sh字符串,但是函数中有read函数。我们有一下几种解法。①我们用LibcSearcher这个模块进行解题②打本地的时候,我们可以在gdb中,用vmmap指令来找到动态链接库的绝对路径,然后用elf = ELF(‘绝对路径’),来算偏移③我们也可以用ldd指令找到相对路径,然后拷贝到当前路径,然后用ipython,用elf = ELF(‘libc.so.6’)来手算偏移。
2. 这是一个64位程序,他和32位程序不同的就是他传递参数,会先用rdi,rsi,rdx,rcx,r8,r9顺序传递参数,我们在gdb中用,ropper或者ROPgadget来查找合适的gadget(需要自己装)。
在这里插入图片描述
在这里插入图片描述
我们找到这几个合适的,但在选rsi的时候,我们发现,这里有两个。乍一看第二个好像合适一些,但我们可以看到他们的地址有很大的区别一个是7f开头的,说明他是动态链接库中的。我们应该选程序本地的,所以我们应该选第一个。
3. 很多人有疑问,这里有一个多余的r15。其实这个不必担心,我们选gadget的初衷就是来传递参数,如果对应的寄存器自己已经满足传递参数的要求,那么我就不用考虑他了。这个题目要求rdx的值至少要大于8个字节,因为我们要泄露一个64位的地址。
2019.7.24 64位程序libc泄露 x64_3_第2张图片
read函数有3个参数,根据参数从用右至左传递,即右边的参数会被保存在栈中相对较高的地址处。所以我们第一个要传递的参数是1,这样依次下去。
4. 这里有一个关键就是接受地址的时候怎么计算从哪里接受到哪里,这就需要我们变写脚本变调试。我们在构造接受的时候,可以随便填数字,只要他满足8个字节(32位是4个字节)。然后我们再用 python ***.py DEBUG 指令来查看程序接受的内容,然后根据内容来决定从哪里接受到哪里。64位程序是7f开头,32位程序是f7开头。下面是我尝试的:
2019.7.24 64位程序libc泄露 x64_3_第3张图片
2019.7.24 64位程序libc泄露 x64_3_第4张图片
注意要在exp中将地址补全为相应的位数。
最后的exp为:
2019.7.24 64位程序libc泄露 x64_3_第5张图片

你可能感兴趣的:(pwn)