The Three Building Blocks of Hangul Vowels: Dot, Flat Line, Upright Line
The ten basic Hangul vowels are assembled from three elements: a dot for heaven, a flat line for earth and an upright line for a person. In modern print the dot appears as a short tick attached to the main stroke. The upright vowels ㅏ (a) and ㅓ (eo) differ by whether the tick points right or left, while ㅣ (i) is the bare upright line. The flat vowels ㅗ (o) and ㅜ (u) differ by whether the tick sits above or below, while ㅡ (eu) is the bare flat line. Add a second tick and you get a y-sound in front: ㅑ (ya), ㅕ (yeo), ㅛ (yo) and ㅠ (yu).
The pairs that trip up most learners are ㅓ against ㅗ, and ㅡ against ㅜ. The eo sound is made with the mouth fairly open and relaxed lips, while o rounds the lips. The eu sound sits at the back of the mouth with the lips kept flat and spread, while u pushes the lips forward. English speakers tend to hear eo as the vowel in cup, which is a reasonable starting point, but the lips have to stay unrounded for it to sound right.
A drill that works well: write the upright vowels and the flat vowels in two columns, then say the confusable pairs side by side in front of a mirror so you can check your lip shape. Once the ten basics are stable, compound vowels such as ㅐ, ㅔ, ㅘ and ㅝ are learned as combinations of shapes you already know. ㅘ, for example, is ㅗ gliding into ㅏ, which gives wa. In present-day Seoul speech ㅐ and ㅔ sound almost identical, so telling them apart matters mostly for spelling.
Your vowels are stable when someone can point at ㅓ, ㅗ, ㅡ or ㅜ at random and you say each one without hesitating or glancing at romanisation.