Eeerrr... antes de nada, trata de explicarte mucho mejor, porque me cuesta mucho entenderte....

Un offset es un desplazamiento respecto a una direccion de memoria. Por ejemplo, kernel32.dll se carga en memoria a partir de la direccion (no me la se, esta es ficticia) 0x76890000. Es decir, en la direccion 0x76890000 EMPIEZA la DLL ( a esto se le llama DIRECCION BASE, curioso xDD). Bien, ahora tu lo que kieres es usar la funcion LoadLibraryA (que esta contenida en esa DLL). Bueno, entonces te informas y te dicen que esa FUNCION tiene como OFFSET 0x7C. Que kiere decir esto? Pues que la funcion la encuentras aki:
Dir. Base + Offset = Direccion de la Funcion
0x76890000 + 0x7C = 0x7689007C
Asi que cuando kieras llamar a LoadLibraryA en ASM, tienes que mandar sus argumentos a la pila (push eax/ebx/ecx o datos a mano..., teniendo en esos registros los argumentos, mandandolos en ORDEN INVERSO). Seria asi:
push eax; // Argumento 2º
push ebx; // Argumento 1º
call 0x7689007C; // Llamada a LoadLibraryA
Esto ejecutara:
LoadLibraryA (argumento1,argumento2);
Creo que se entiende no?
Que esten en C y que funcionen en MSDOS no tiene nada que ver, informate sobre el lenguaje C

Los chicos de Microsoft, son la ostia de caxondos en esto de los offsets. Te explico. Segun version del sistema operativo, service packs instalados, parches, etc etc... las DIRECCIONES BASE de las DLL y los correspondientes OFFSETS de las funciones en ellas contenidas SON DISTINTOS.
Es decir:
(ejemplo, datos ficticios y puede que exagerados

xDD)
Win 98 --> Dir Base kernel32.dll = 0x78960000
Win 2k --> Dir Base kernel32.dll = 0x79990000
Win 2k SP1 --> Dir Base kernel32.dll = 0x80000000
Win 2k SP4 --> Dir Base kernel32.dll = 0x79880000
Win XP --> Dir Base kernel32.dll = 0x80600000
Win XP SP1 --> Dir Base kernel32.dll = 0x80500000
Como ves, si durante la shellcode queremos llamar a LoadLibraryA, pues tenemos que meter A MANO la direccion de memoria del kernel32.dll (esto se llama HARDCODEAR DIRECCIONES O OFFSETS) y luego su offset. Esto lo que hace que tengamos que hacer varias shellcodes para cada sistema explotable.
Yo me he informado, y hay bastantes tecnicas para hacer una shellcode para windows (y linux) SIN HARCODEAR DIRECCIONES, con lo que los exploits SON MULTIWINDOWS, y no hay menu para elegir SO. Pero este tema keda fuera de esta explicacion
Con la PILA (Stack) pasa lo mismo, varia segun el sistema operativo, SPs instalados, etc etc... y puede que en tu PC si que funcione la RET 0x78906789, pero en otro PC puede que no. Por eso hay algoritmos en C que hacen un bruteforce a la RET ADDRESS, hasta que encuentran la que apunta a la shellcode.
La shellcode normalmente va como argumento del programa, argumento que se copia a un buffer mal construido, que peta

. Luego puedes llamar a la shellcode a ese buffer petado o a donde estaba antiguamente, en los argumentos (en ARGV exactamente).
Sobre esto ultimo, hay muchos textos en la red que explican en funcionamiento de un overflow basico, buscalos

Ademas, me estoy cansando de escribir XDDD
Espero que te ayude

Salu2