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.