0x00 前言
看蒸米师傅的一步一步学ROP做的笔记
0x01 程序源代码:
和第一篇一样
1 | #include <stdio.h> |
编译,依旧关闭stack protecter和ASLR:
1 | gcc -fno-stack-protector -o level2 level2.c |
查看程序的保护机制:
1 | mask@mask-virtual-machine:~/mzheng$ gdb ./level2 |
这时候NX是开启的,也就是说我们之前的shellcode在栈中是不能执行的,那么怎样执行shellcode呢?
ldd命令是查看程序包含了哪些库文件
1 | mask@mask-virtual-machine:~/mzheng$ ldd level2 |
我们知道level2调用了libc.so,并且libc.so里保存了大量可利用的函数,我们如果可以让程序执行system(“/bin/sh”)的话,也可以获取到shell。
那么接下来就是获取system()这个函数的地址以及”/bin/sh”这个字符串的地址。
下面是蒸米文章中的原话
如果关掉了ASLR的话,system()函数在内存中的地址是不会变化的,并且libc.so中也包含”/bin/sh”这个字符串,并且这个字符串的地址也是固定的。那么接下来我们就来找一下这个函数的地址。这时候我们可以使用gdb进行调试。然后通过print和find命令来查找system和”/bin/sh”字符串的地址。
1 | Breakpoint 1, 0x0804846e in main () |
那么两样都齐全了,开始编写exp:
1 | #!/usr/bin/env python |
这里因为我们不去执行返回地址处的代码,当然开了NX你也执行不了,所以我们ret就随意写个,凑够字节数即可
运行:
1 | mask@mask-virtual-machine:~/mzheng$ vim exp2.py |