Results 1 to 6 of 6

Thread: Data in Code Section

  1. #1

    Data in Code Section

    greetings..!

    question is related to assembly lang...request, if this's a trespass, it may be overlooked for once!

    Code:
    include c:\masm32\include\masm32rt.inc
    
    .data
    var1   dword   ?
    
    .code
    start:
    mov eax, 76543210
    mov var1, eax
    
        push offset var1
        push eax
        call dwtoa
    
    invoke StdOut, offset var1
    invoke ExitProcess, 0
    end start
    comment
    the above asm code links to form .obj and .exe file, gives output: 76543210.

    1-slightly modifying the above code to:

    Code:
    .start:
    
    mov eax, 76543210
    mov var1, eax
    
    invoke StdOut, offset var1
    why this code (without calling dwtoa), doesn't give the same output, although the same value is saved at the address of var1.?

    2-next, i would like to declare and save the data, in the code section like:

    Code:
    invoke StdOut, offset var1
    invoke ExitProcess, 0
    
    var1   dword   ?
    end start
    linker doesnot agree to it - how to convince linker to accept it.

    thank you..!
    Last edited by Ret; July 23rd, 2012 at 10:45. Reason: text alignment
    I promise that I have read the FAQ and tried to use the Search to answer my question.

  2. #2
    Super Moderator
    Join Date
    Dec 2004
    Posts
    1,525
    Blog Entries
    15
    ;data declaration required upfront before start of code (ie before start:
    ;if not using .data section and want to put data in .text section
    ;beware this kind of code is vulnerable to exploits
    ;data should be in .data section which has read write permissions
    ;but doesnt have execution permission read about dep / aslr /
    ;use only for satisfying curiosity do not use in real life code
    ;also note i declare 2 more dwords because dwtoa will use 8 bytes
    ;if i had declared only one dword the code will be screwed up
    ;by dwtoa routine actually i reluctantly answer this part of question
    ;you should use a debugger to watch and learn how to eliminate this
    ;kind of problems
    ;also bear in mind after declaring in .code section you need to
    ;change permissions of code section with /SECTION: linker argument
    ;see linker command line below

    ;compile and link with
    ;ml /c /coff /nologo %1.asm"
    ;link /nologo /section:.text,rwe /SUBSYSTEM:CONSOLE %1.obj

    ;also use qualifiers like hex oct bin dec etc which would help you
    ;in writing good code your 76543210 without h (hex qualifier)
    ;would be treated as decimal by the compiler (ml.exe) and it will convert it
    ;to hex viz eax / var1 will hold 048FF4EA which would be converted to
    ;3736353433323130 for first invoke
    ; ea f4 8f 04
    ;will print Ω ⌠ ♦ + leftover garbage 3210 for second invoke



    Code:
    include \masm32\include\masm32rt.inc
    .code
    	var1	dword	3 dup(?)	
    start:
    
    	mov	eax,	76543210
    	mov var1,	eax
    	push offset var1
        push eax
        call dwtoa 
          
        ;                    7 6 5 4 3 2 1 0
        ; var1 will contain 3736353433323130 after calling dword to ascii routine
        invoke StdOut, offset var1
        
        ;the following Stdout will print the dword as ascii 
        ; ie it will print Ω⌠♦ + leftover garbage of dwtoa viz 3210 ;
        ;like Ω⌠♦3210
         
        mov	eax,	76543210
    	mov var1,	eax	
    	invoke StdOut, offset var1 
    
        invoke ExitProcess, 0    
    end start

  3. #3
    Thank you... blabberer..!

    your clarification is valued, its right to the point and very commendable.!

    your 76543210 without h (hex qualifier) would be treated as decimal by the compiler (ml.exe) and it will convert it
    to hex viz eax / var1 will hold 048ff4ea which would be converted to 3736353433323130..
    adding to the above, your reminder that ascii is 8-bit value, did the rest

    var1 dword 3 dup (?)
    yes - for the time being, it resolves my uncertainty linked to dwtoa ()

    The intention for saving data in code section is meant for finding the direct address of the dll's -
    - and then locating the addresses of apis residing within .dlls - meant for using them run time.

    say for instance: for locating the address of the kernel32.dll
    and then proceed to get the address of ExitProcess that reside within it.

    meanwhile, i need to go over your earlier instructions once again, and be trying to follow it to the
    best of my understanding. anyway, i be back when iam stuck on the way...which is highly probable.!

    thank you once again..!
    I promise that I have read the FAQ and tried to use the Search to answer my question.

  4. #4
    with data defined in data section:
    > ml /c /coff 1.asm > link /subsystem: console 1.obj
    Code:
    include c:\masm32\include\masm32rt.inc
    .data
    
    var1 dword 3 dup (?); <---
    
    .code
    start:
    mov  eax, 7543210h
    mov  var1, eax
    push offset var1
    push eax
    call dwtoa
    
    invoke StdOut, offset var1 
    invoke ExitProcess, 0
    end start
    out put: 122958352 = 7543210h
    --
    with data defined in code section:
    > ml /c /coff /nologo %3.asm
    Code:
    include c:\masm32\include\masm32rt.inc
    .data
    
    .code
    start:
    mov  eax, 7543210h
    mov  var1, eax
    push offset var1
    push eax
    call dwtoa
    
    invoke StdOut, offset var1 
    invoke ExitProcess, 0
    
    var1 dword 3 dup (?)  ; <---
    
    end start
    if > ml /c /coff /nologo %3.asm is used -
    : fatal error a1000: cannot open file: %3.asm

    if > ml /c /coff /nologo 3.asm used - without (%)
    : error a2006: undefined symbol: var1
    : error a2114: invoke argument type mismatch: argument: 1

    the assembler fails to see the file when its named %3.asm.
    the assembler fails to see the var1 when its named 3.asm.

    how do i get over this hurdle..!?
    I promise that I have read the FAQ and tried to use the Search to answer my question.

  5. #5
    Super Moderator
    Join Date
    Dec 2004
    Posts
    1,525
    Blog Entries
    15
    the assembler fails to see the file when it�s named %3.asm.
    you need to pick up basics a bit more

    the %1 is a wildcard for batch file scripts

    suppose you have a command ml foo.asm in a batch file

    if you execute it it will look for foo.asm only but wont compile blah.asm

    so instead of ml foo.asm if i have a batchfile named compile.bat

    that has

    ml %1.asm

    i can use it to compile any asm file

    all i need to do is



    compile.bat foo the %1 will now hold foo so it will compile foo.asm

    compile,bat blah the %1 will now hold blah so it will compile blah.asm

    compile.bat xyz the %1 will now hold xyz so it will compile xyz.asm

    so you need the file named normally


    the assembler fails to see the var1 when it�s named 3.asm.
    this has got nothing to do with file name
    you either havent read my earlier reply
    or if you have read it
    you haven't spent a few minutes trying to understand what was written

    or you dont care and cant even copy paste properly

    and you dont want to spend time finding out what the error messages mean from the compiler

    the compiler explicitly stated you havent defined the symbol didn't you see ????

    : error a2006: undefined symbol: var1
    i wrote you need to declare your variables at the start not at the end also i posted a code snippet

    you are using your var1 before it is declared so obviously compiler wont know what the heck it is

    var 1 needs forward referancing like

    Code:
    .code
    	var1	dword	3 dup(?)	
    start:
    
    	mov	eax,	76543210
    should not be declared after

    ExitProcess()

    btw keep in mind ExitProcess is defined as a function that wont return ( __declspec __noreturn ) in headers

    so anything you do after ExitProcess Will normally be of no use
    they wont be executed if they are not reachable

  6. #6
    blabberer..!

    i did not remember and shouldnot have forgotton - that a variable should have at least been declared
    before its being used - yes i forgot the basics when i needed it - apologies for this inadequacy -

    Code:
    .code
        var1 dword 3 dup (?)
        start:
        mov eax, 7543210h
        mov var1, eax
        .. ..
        .. ..
        invoke stdout, offset var1
    the above code as suggested by blabberer with suitable options for linking
    and assembling, resolved my difficulty as i stated in - data in code section -

    thank you..!
    I promise that I have read the FAQ and tried to use the Search to answer my question.

Similar Threads

  1. Replies: 4
    Last Post: August 14th, 2010, 00:23
  2. Replies: 0
    Last Post: July 14th, 2009, 22:37
  3. Code Section Modified after ZwMapViewOfSection
    By DeepBlueSea in forum Advanced Reversing and Programming
    Replies: 6
    Last Post: August 14th, 2008, 20:37
  4. Replies: 2
    Last Post: October 3rd, 2006, 08:23
  5. Replies: 10
    Last Post: November 9th, 2002, 04:50

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •