Re: win32 call dword ptr [eax] help needed

dave_at_immunitysec.com
Date: 09/09/03

  • Next message: Alfred Huger: "Voting on issues for this list and SecurityFocus (Vuln-Dev)"
    Date: 9 Sep 2003 11:30:24 -0000
    To: vuln-dev@securityfocus.com
    
    
    ('binary' encoding is not supported, stored as-is) In-Reply-To: <web-17355992@gator.darkhorse.com>

    What you've done is overwrite a C++ object's vtable in
    the heap. This is almost never reliable, in my
    experience. Your best bet is to go back, perhaps use a
    much smaller attack string, and find some way to do the
    chunk-overwrite instead. Then overwrite a known
    function pointer (or, if you know the target's SP, the
    unhandled exception function pointer). (Or write a
    instruction somewhere and then set the function to
    point to that with another word-write...)

    Dave Aitel
    Immunity Inc.

    >I'm working on writing an exploit for a unnamed
    program. (I will release details once i'm told a patch
    is available.
    >But i'm having serious issues making this exploit
    reliable. Currently, I'm referencing hardcoded values
    in the stack.
    >This is obviously a terrible idea, even though i've
    had this exploit work on multiple machines even with
    reboots.
    >But all of a sudden the addresses changed on my
    machine which obviously broke my exploit.
    >Execution flow is altered via a:
    >.text:10011032 call dword ptr [eax+4]
    >Here is where my problem is, I need to find two
    reliable addresses.
    >one address to contain another address to contain the
    address of my shellcode.
    >I searched memory looking for my overflow string, it
    *only* resides in the stack. So I tried searching
    >for addresses that would reference that area of the
    stack and i've come up with nothing. The overflow string
    >only exists once in memory. What i need help with is,
    is there a specific technique for this type of
    exploitation?
    >Here are some of my notes to make this situation a
    little bit more clear:
    >This is a network client based overflow so my exploit
    listens on a specific port.
    >Once the client connects I send a large string, the
    first 4 bytes appear to be use in calling w32.recv();.
    >How this relates to the overflow i'm not sure i've
    only followed the full execution once and i was tired
    at the time :).
    >Here is the actual function of the execution being
    altered:
    >.text:1001101E loc_1001101E:
     ; CODE XREF: sub_10010F80+69j
    >.text:1001101E
       ; sub_10010F80+147j ...
    >.text:1001101E mov eax, [ebx]
    >.text:10011020 mov ecx, ebx
    >.text:10011022 mov
    [esp+328h+timeout.tv_sec], 78h
    >.text:1001102A mov
    [esp+328h+timeout.tv_usec], 0
    >.text:10011032 call dword ptr [eax+4]
    >.text:10011035 test al, al
    >.text:10011037 jnz loc_100110E2
    >.text:1001103D mov edx,
    [esp+328h+writefds]
    >.text:10011044 mov edi,
    [esp+328h+readfds]
    >.text:1001104B lea ecx,
    [esp+328h+timeout]
    >.text:1001104F push ecx
     ; timeout
    >.text:10011050 push ebp
     ; exceptfds
    >.text:10011051 push edx
     ; writefds
    >.text:10011052 push edi
     ; readfds
    >.text:10011053 push 0
     ; nfds
    >.text:10011055 call ds:select
     ; Determine the status of one or more
    >.text:10011055
     ; sockets, waiting if necessary
    >.text:1001105B mov esi,
    [esp+328h+arg_10]
    >.text:10011062 mov ecx, ebx
    >.text:10011064 mov [esi], eax
    >.text:10011066 mov eax, [ebx]
    >.text:10011068 call dword ptr [eax+4]
    >this would be the overflow function, execution is
    redirected by the call dword ptr [eax+4] via 10011032.
    >
    >00DA02EF 8BBC24 3C010000 MOV EDI,DWORD PTR SS:[ESP+13C]
    >00DA02F6 8B06 MOV EAX,DWORD PTR DS:[ESI]
    >00DA02F8 8B9424 38010000 MOV EDX,DWORD PTR SS:[ESP+138]
    >00DA02FF 8BCF MOV ECX,EDI
    >00DA0301 2BC8 SUB ECX,EAX
    >00DA0303 6A 00 PUSH 0
    >00DA0305 03C2 ADD EAX,EDX
    >00DA0307 51 PUSH ECX
    >00DA0308 50 PUSH EAX
    >00DA0309 8B45 04 MOV EAX,DWORD PTR SS:[EBP+4]
    >00DA030C 50 PUSH EAX
    >00DA030D FF15 9058DA00 CALL DWORD PTR
    DS:[<&WSOCK32.#16>] ;
    WSOCK32.recv
    >00DA0313 8BD8 MOV EBX,EAX
    >now EAX contains 6C3 (size of our buffer of
    characters) which was read.
    >
    >
    >Sets buffsize to 41414141?!?! i presume it reads in
    the data from the server, the server
    >should be responding with 'hey i have this much data
    for you to read', so the client ack's
    >and uses the 41414141 as the size to wsock32.recv
    function call.
    >
    >
    >this is for calling WSOCK32.recv
    >
    >0182E660 00000174 |Socket = 174
    >0182E664 0182E820 |Buffer = 0182E820
    >0182E668 41414141 |BufSize = 41414141 (1094795585.)
    >0182E66C 00000000 \Flags = 0
    >0182E670 0182E820 ASCII "127.0.0.1"
    >
    >
    >
    >edi contains 5th-8th bytes of our data
    >eax is null
    >edx is our ip
    >ecx is set to edi (5th-8th byte)
    >
    >so buffsize is set to 5th to 8th bytes for the call to
    wsock32.recv
    >
    >------------------- later on in the program
    ----------------------
    >
    >00DA101E 8B03 MOV EAX,DWORD PTR DS:[EBX]
    >00DA1020 8BCB MOV ECX,EBX
    >
    >eax is set to the beginning of the string 0x41414141
    >ebx contains the address of our string, which is
    copied into ecx.
    >
    >
    >00DA1022 C74424 14 780000>MOV DWORD PTR SS:[ESP+14],78
    >00DA102A C74424 18 000000>MOV DWORD PTR SS:[ESP+18],0
    >00DA1032 FF50 04 CALL DWORD PTR DS:[EAX+4]
    >
    >boom. our address 0x41414141+4 (0x4141414145) is
    called for execution.
    >and since we control this address we overwrite it with
    a *ugh* hardcoded
    >address in the stack.
    >0x0182eb40 -> overwrite eax with this address, which
    gets +4 added to it. this is
    >the address of the next 4 bytes after the address
    which we used to overwrite eax with.
    >since its a call dword ptr call, we need to put the
    NEXT address of the four bytes in this
    >location.
    >so here's the flow:
    >overwrite EAX at 808th (decimal) byte which is addr:
    0x0182eb3d, with the address of
    >0x0182eb40. which gets 4 added to it making 0x0182eb44.
    >the address of 0x0182eb44 contains the address of
    0x0182eb48 which is the address
    >of our shellcode.
    >
    >CALL DWORD PTR EAX+4 => [Next 4 bytes] => Address of
    Next 4 Bytes which is the beginning of our shellcode.
    >
    >As you can see this is a *terrible* exploit, so, once
    again is there any technique I am missing?
    >any help would be *greatly* appreciated.
    >
    >Sorry I can not give out any more information on the
    program but i have to wait until i hear something from
    the makers!
    >-wire
    >--
    >Visit Things From Another World for the best
    >comics, movies, toys, collectibles and more.
    >http://www.tfaw.com/?qt=wmf
    >


  • Next message: Alfred Huger: "Voting on issues for this list and SecurityFocus (Vuln-Dev)"

    Relevant Pages

    • win32 call dword ptr [eax] help needed
      ... I searched memory looking for my overflow string, it *only* resides in the stack. ... How this relates to the overflow i'm not sure i've only followed the full execution once and i was tired at the time:). ... the address of the next 4 bytes after the address which we used to overwrite eax with. ...
      (Vuln-Dev)
    • Re: Advice on storage and retrieval
      ... bAlreadyExists = cStore.CheckAdd'don't overwrite if exists ... Public Sub Save(Optional Destination As String) ... Public Property Let Item ...
      (microsoft.public.vb.general.discussion)
    • VB6 --> VB.net Konvertierung
      ... Public Sub RunWinZipExtract(f As Form, zipfile As String, PathtoExtract As ... Dim CommandLine As String ... ' Check whether user wants to overwrite ...
      (microsoft.public.de.german.entwickler.dotnet.vb)
    • Re: Advice on storage and retrieval
      ... so I guess I could use your suggestion when you don't want to overwrite ... Public Sub Save(Optional Destination As String) ... Public Property Let Item(ByVal Name As String, ByVal Value As Variant) ...
      (microsoft.public.vb.general.discussion)
    • Re: export a field from a table to make a text file
      ... >> Dim strFileSpec As String ... >> 'Overwrite argument controls what happens ... >> Dim lngFN As Long ...
      (microsoft.public.access.externaldata)