The problem is pretty straightforward. Use indirect addressing (in other words, don't use the memory addresses directly but reference them, through a register perhaps) and reverse the string.  For example, here are some barebones assuming that you have already defined source and target:
MOV SI, source   ; Get source address
MOV DI, (target + SIZEOF source)   ; Get the ending address for target
LOOP:
  MOV AL, [SI]   ; Get a byte
  MOV [DI], AL   ; Store a byte
  INC SI         ; Move forward one in source
  DEC DI         ; Move back one in target
  CMP AL, 0      ; Have we reached the zero termination?
  JNZ LOOP
RET
This is by no means meant to be complete or functional. You may, for instance, need to figure out a better way to figure out the length of SOURCE dynamically. :)  However, I don't want to take the joy of learning away from you.  This should  be at least a good starting point.