To solve the given optimization problem, we first need to translate the natural language description into a symbolic representation. This involves defining variables, an objective function, and constraints based on the problem statement.

Let's define:
- $x_1$ as the number of social media adverts,
- $x_2$ as the number of magazine covers.

The objective is to maximize exposure, which can be calculated as $100000x_1 + 54000x_2$, since each social media post reaches 100,000 viewers and each magazine cover reaches 54,000 readers.

The constraints are:
1. Budget constraint: The total cost must not exceed $500,000. Given that each social media advert costs $3,000 and each magazine cover costs $6,000, this can be represented as $3000x_1 + 6000x_2 \leq 500000$.
2. Lower bound on social media posts: At least 10 social media posts must be ordered, so $x_1 \geq 10$.
3. Upper bound on social media posts: At most 20 social media posts can be ordered, so $x_1 \leq 20$.
4. Lower bound on magazine covers: At least 24 magazine covers should be contracted, so $x_2 \geq 24$.

The symbolic representation of the problem is:
```json
{
    'sym_variables': [('x1', 'number of social media adverts'), ('x2', 'number of magazine covers')],
    'objective_function': 'maximize 100000*x1 + 54000*x2',
    'constraints': [
        '3000*x1 + 6000*x2 <= 500000',
        'x1 >= 10',
        'x1 <= 20',
        'x2 >= 24'
    ]
}
```

Now, let's implement this optimization problem using Gurobi in Python:

```python
from gurobipy import *

# Create a new model
m = Model("Movie_Exposure")

# Define variables
x1 = m.addVar(lb=10, ub=20, vtype=GRB.INTEGER, name="social_media_adverts")
x2 = m.addVar(lb=24, vtype=GRB.INTEGER, name="magazine_covers")

# Set the objective function
m.setObjective(100000*x1 + 54000*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(3000*x1 + 6000*x2 <= 500000, name="budget_constraint")

# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Social Media Adverts: {x1.x}")
    print(f"Magazine Covers: {x2.x}")
    print(f"Maximum Exposure: {m.objVal}")
else:
    print("No optimal solution found")
```