Faulty Code

import std;
#include <windows.h>

bool hDoRemaining(HANDLE hdle, std::string payload) {

    if (hdle != INVALID_HANDLE_VALUE) {
        CloseHandle(hdle);
    }
    CloseHandle(hdle);
    auto cPayload = payload.c_str();
    DWORD bytesWritten;
    if (WriteFile(hdle, cPayload, strlen(cPayload), &bytesWritten, nullptr)) {
        return true;
    }
    std::cout << "Payload / bytesWritten " << strlen(cPayload) / bytesWritten << std::endl;
    return true;
}


bool hIsWriteable(HANDLE hdle, std::string payload) {
    if (hdle != INVALID_HANDLE_VALUE) {
        DWORD bytesWritten;
        auto cPayload = payload.c_str();
        if (WriteFile(hdle, cPayload, strlen(cPayload), &bytesWritten, nullptr)) {
            return hDoRemaining(hdle, payload);
        }
    }
 
    return false;   
}

bool hCreateFile(std::string payload) {
    auto hdle = CreateFileA(
        "access.log",
        GENERIC_WRITE | GENERIC_READ,
        0,
        nullptr,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        nullptr
    );
    return hIsWriteable(hdle, payload);
}

std::string doXor(char key, const std::string& payload) {
    std::string out(payload.size(), '\0'); 
    for (size_t i = 0; i < payload.size(); ++i) {
        out[i] = payload[i] ^ key;  
    }
    return out;
}

int main() {
    std::string payload= "127.0.0.1 - jane [21/Apr/2023:13:05:11 -0700] GET / index.html HTTP / 1.1 200 2326";
    auto output = doXor(0x99, payload);

    if (hCreateFile(output)) {
        std::println("Writing Successful");
    }
}
  • Double Closing the Handle: The main error here is that the handle is closed before it’s used. Specifically, CloseHandle(hdle) is called twice - once unconditionally before WriteFile is invoked, and again at the end. This causes a double closing of the handle, making it invalid for the WriteFile function.

  • Division by Zero Risk: The handle closing causes division by zero (i.e. bytesWritten=0).

Procdump Setup

>_  SysinternalsSuite ➜  .\procdump.exe -ma -i E:\Codes\DebugApplication\Dumps\

ProcDump v11.0 - Sysinternals process dump utility
Copyright (C) 2009-2022 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com

Set to:
  HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
    (REG_SZ) Auto     = 1
    (REG_SZ) Debugger = "C:\Tools\SysinternalsSuite\procdump.exe" -accepteula -ma -j "E:\Codes\DebugApplication\Dumps" %ld %ld %p

Set to:
  HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug
    (REG_SZ) Auto     = 1
    (REG_SZ) Debugger = "C:\Tools\SysinternalsSuite\procdump.exe" -accepteula -ma -j "E:\Codes\DebugApplication\Dumps" %ld %ld %p

ProcDump is now set as the Just-in-time (AeDebug) debugger.

Install and set the dump path to E:\Codes\DebugApplication\Dumps

or it can be changed through Registry

alt text

Compile and Run it. Upon program termination due to an unhandled exception, a core dump will be automatically saved to disk.

 ╰─λ ls
DebugApplication.exe_250205_084645.dmp  DebugApplication.exe_250205_084646.dmp

After getting dump, Set the Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

  • Auto to 0.

Load the generated dump file in windbg for analysis.

0:000> !analyze -v
*******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
*******************************************************************************


KEY_VALUES_STRING: 1

    Key  : Analysis.CPU.mSec
    Value: 546

    Key  : Analysis.Elapsed.mSec
    Value: 41995

    Key  : Analysis.IO.Other.Mb
    Value: 1

    Key  : Analysis.IO.Read.Mb
    Value: 1

    Key  : Analysis.IO.Write.Mb
    Value: 6

    Key  : Analysis.Init.CPU.mSec
    Value: 625

    Key  : Analysis.Init.Elapsed.mSec
    Value: 7396

    Key  : Analysis.Memory.CommitPeak.Mb
    Value: 92

    Key  : Analysis.Version.DbgEng
    Value: 10.0.27725.1000

    Key  : Analysis.Version.Description
    Value: 10.2408.27.01 amd64fre

    Key  : Analysis.Version.Ext
    Value: 1.2408.27.1

    Key  : Failure.Bucket
    Value: INTEGER_DIVIDE_BY_ZERO_c0000094_DebugApplication.exe!hDoRemaining

    Key  : Failure.Hash
    Value: {eb875f65-3c8b-ba45-7fb3-ce4ffd1e8c9d}

    Key  : Timeline.OS.Boot.DeltaSec
    Value: 61256

    Key  : Timeline.Process.Start.DeltaSec
    Value: 1

    Key  : WER.OS.Branch
    Value: ge_release

    Key  : WER.OS.Version
    Value: 10.0.26100.1


FILE_IN_CAB:  DebugApplication.exe_250205_084645.dmp

COMMENT:  
*** "C:\Tools\SysinternalsSuite\procdump.exe" -accepteula -ma -j "E:\Codes\DebugApplication\Dumps" 2496 620 00000242E2740000
*** Just-In-Time debugger. PID: 2496 Event Handle: 620 JIT Context: .jdinfo 0x242e2740000

NTGLOBALFLAG:  0

APPLICATION_VERIFIER_FLAGS:  0

CONTEXT:  (.ecxr)
rax=0000000000000052 rbx=0000000000000000 rcx=0000000000000000
rdx=0000000000000000 rsi=0000000000000000 rdi=0000008171b2f538
rip=00007ff7c2929e47 rsp=0000008171b2f460 rbp=0000008171b2f490
 r8=7efefefefefefeff  r9=4ccccccccbffaeaa r10=00000242e2571ac0
r11=8101010101010100 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000
iopl=0         nv up ei pl zr na po nc
cs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010246
DebugApplication!hDoRemaining+0xf7:
00007ff7`c2929e47 48f7f1          div     rax,rcx
Resetting default scope

EXCEPTION_RECORD:  (.exr -1)
ExceptionAddress: 00007ff7c2929e47 (DebugApplication!hDoRemaining+0x00000000000000f7)
   ExceptionCode: c0000094 (Integer divide-by-zero)
  ExceptionFlags: 00000000
NumberParameters: 0

PROCESS_NAME:  DebugApplication.exe

ERROR_CODE: (NTSTATUS) 0xc0000094 - {EXCEPTION}  Integer division by zero.

EXCEPTION_CODE_STR:  c0000094

STACK_TEXT:  
00000081`71b2f460 00007ff7`c292a0a6     : 00000000`000000d8 00000081`71b2f768 00000000`00000000 00000081`71b2f644 : DebugApplication!hDoRemaining+0xf7
00000081`71b2f610 00007ff7`c2929cfd     : 00000000`000000d8 00000081`71b2f958 00000081`71b2fb40 00000000`00000053 : DebugApplication!hIsWriteable+0xd6
00000081`71b2f810 00007ff7`c292aa01     : 00000081`71b2fb38 00000081`71b2fa38 00000081`71b2f9f8 00320070`00700043 : DebugApplication!hCreateFile+0x8d
00000081`71b2f9d0 00007ff7`c2939879     : 000004ca`00000001 00007ff9`700825c8 00000000`00000000 00007ff7`c293b02d : DebugApplication!main+0x91
00000081`71b2fc20 00007ff7`c2939722     : 00007ff7`c2942000 00007ff7`c2942220 00000000`00000000 00000000`00000000 : DebugApplication!invoke_main+0x39
00000081`71b2fc70 00007ff7`c29395de     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : DebugApplication!__scrt_common_main_seh+0x132
00000081`71b2fce0 00007ff7`c293990e     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : DebugApplication!__scrt_common_main+0xe
00000081`71b2fd10 00007ffa`49c7e8d7     : 00000081`71cb0000 00000000`00000000 00000000`00000000 00000000`00000000 : DebugApplication!mainCRTStartup+0xe
00000081`71b2fd40 00007ffa`4b9bfbcc     : 00000000`00000000 00000000`00000000 000004f0`fffffb30 000004d0`fffffb30 : kernel32!BaseThreadInitThunk+0x17
00000081`71b2fd70 00000000`00000000     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x2c


STACK_COMMAND:  ~0s; .ecxr ; kb

FAULTING_SOURCE_LINE:  E:\Codes\DebugApplication\DebugApplication\DebugApplication.cpp

FAULTING_SOURCE_FILE:  E:\Codes\DebugApplication\DebugApplication\DebugApplication.cpp

FAULTING_SOURCE_LINE_NUMBER:  15

FAULTING_SOURCE_CODE:  
    11:     DWORD bytesWritten;
    12:     if (WriteFile(hdle, cPayload, strlen(cPayload), &bytesWritten, nullptr)) {
    13:         return true;
    14:     }
>   15:     std::cout << "Payload / bytesWritten " << strlen(cPayload) / bytesWritten << std::endl;
    16:     return true;
    17: }
    18: 
    19: 
    20: bool hIsWriteable(HANDLE hdle, std::string payload) {


SYMBOL_NAME:  DebugApplication!hDoRemaining+f7

MODULE_NAME: DebugApplication

IMAGE_NAME:  DebugApplication.exe

FAILURE_BUCKET_ID:  INTEGER_DIVIDE_BY_ZERO_c0000094_DebugApplication.exe!hDoRemaining

OS_VERSION:  10.0.26100.1

BUILDLAB_STR:  ge_release

OSPLATFORM_TYPE:  x64

OSNAME:  Windows 10

FAILURE_ID_HASH:  {eb875f65-3c8b-ba45-7fb3-ce4ffd1e8c9d}

Followup:     MachineOwner
---------

.exr: displays various information about exception record like ExceptionAddress, ExceptionCode, ExceptionFlags and NumberofParameters.

To display the most recent exception record. Use .exr -1

0:000> .exr -1
ExceptionAddress: 00007ff7c2929e47 (DebugApplication!hDoRemaining+0x00000000000000f7)
   ExceptionCode: c0000094 (Integer divide-by-zero)
  ExceptionFlags: 00000000
NumberParameters: 0

Debugger Output Line

                                          +---------------+-----------------+-----------------+-----------------+
                                          |       RCX     |        RDX      |     R8          |    R9           |
00000081`71b2f810 00007ff7`c292aa01     : 00000081`71b2fb38 00000081`71b2fa38 00000081`71b2f9f8 00320070`00700043 : DebugApplication!hCreateFile+0x8d
Register Inspections

Let’s Inspect the register values while calling the function.

Inspecting RDX

0:000> db 00000081`71b2fa38
00000081`71b2fa38  60 c9 57 e2 42 02 00 00-c0 d9 57 e2 42 02 00 00  `.W.B.....W.B...
00000081`71b2fa48  00 00 00 00 00 00 00 00-52 00 00 00 00 00 00 00  ........R.......
00000081`71b2fa58  5f 00 00 00 00 00 00 00-cc cc cc cc cc cc cc cc  _...............
00000081`71b2fa68  cc cc cc cc cc cc cc cc-cc cc cc cc cc cc cc cc  ................
00000081`71b2fa78  cc cc cc cc cc cc cc cc-cc cc cc cc cc cc cc cc  ................
00000081`71b2fa88  cc cc cc cc cc cc cc cc-cc cc cc cc cc cc cc cc  ................
00000081`71b2fa98  cc cc cc cc cc cc cc cc-cc cc cc cc cc cc cc cc  ................
00000081`71b2faa8  cc cc cc cc cc cc cc cc-cc cc cc cc cc cc cc cc  ................
0:000> db poi(00000081`71b2fa38+0x8)
00000242`e257d9c0  a8 ab ae b7 a9 b7 a9 b7-a8 b9 b4 b9 f3 f8 f7 fc  ................
00000242`e257d9d0  b9 c2 ab a8 b6 d8 e9 eb-b6 ab a9 ab aa a3 a8 aa  ................
00000242`e257d9e0  a3 a9 ac a3 a8 a8 b9 b4-a9 ae a9 a9 c4 b9 de dc  ................
00000242`e257d9f0  cd b9 b6 b9 f0 f7 fd fc-e1 b7 f1 ed f4 f5 b9 d1  ................
00000242`e257da00  cd cd c9 b9 b6 b9 a8 b7-a8 b9 ab a9 a9 b9 ab aa  ................
00000242`e257da10  ab af 00 cd cd cd cd cd-cd cd cd cd cd cd cd cd  ................
00000242`e257da20  fd fd fd fd 00 00 00 00-e5 54 35 34 00 10 00 80  .........T54....
00000242`e257da30  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

Inspecting R8

0:000> db 00000081`71b2f9f8
00000081`71b2f9f8  50 ca 57 e2 42 02 00 00-c0 d4 57 e2 42 02 00 00  P.W.B.....W.B...
00000081`71b2fa08  00 00 00 00 00 00 00 00-52 00 00 00 00 00 00 00  ........R.......
00000081`71b2fa18  5f 00 00 00 00 00 00 00-cc cc cc cc cc cc cc cc  _...............
00000081`71b2fa28  cc cc cc cc cc cc cc cc-cc cc cc cc cc cc cc cc  ................
00000081`71b2fa38  60 c9 57 e2 42 02 00 00-c0 d9 57 e2 42 02 00 00  `.W.B.....W.B...
00000081`71b2fa48  00 00 00 00 00 00 00 00-52 00 00 00 00 00 00 00  ........R.......
00000081`71b2fa58  5f 00 00 00 00 00 00 00-cc cc cc cc cc cc cc cc  _...............
00000081`71b2fa68  cc cc cc cc cc cc cc cc-cc cc cc cc cc cc cc cc  ................

0:000> db poi(00000081`71b2f9f8+0x8)
00000242`e257d4c0  31 32 37 2e 30 2e 30 2e-31 20 2d 20 6a 61 6e 65  127.0.0.1 - jane
00000242`e257d4d0  20 5b 32 31 2f 41 70 72-2f 32 30 32 33 3a 31 33   [21/Apr/2023:13
00000242`e257d4e0  3a 30 35 3a 31 31 20 2d-30 37 30 30 5d 20 47 45  :05:11 -0700] GE
00000242`e257d4f0  54 20 2f 20 69 6e 64 65-78 2e 68 74 6d 6c 20 48  T / index.html H
00000242`e257d500  54 54 50 20 2f 20 31 2e-31 20 32 30 30 20 32 33  TTP / 1.1 200 23
00000242`e257d510  32 36 00 cd cd cd cd cd-cd cd cd cd cd cd cd cd  26..............
00000242`e257d520  fd fd fd fd 00 00 00 00-15 54 c5 34 00 08 00 80  .........T.4....
00000242`e257d530  5c 00 3f 00 3f 00 5c 00-45 00 3a 00 5c 00 30 00  \.?.?.\.E.:.\.0.
Decrypt the original content

Inspecting RCX

0:000> db 8171b2fb38
00000081`71b2fb38  40 cb 57 e2 42 02 00 00-e0 d7 57 e2 42 02 00 00  @.W.B.....W.B...
00000081`71b2fb48  00 00 00 00 00 00 00 00-52 00 00 00 00 00 00 00  ........R.......
00000081`71b2fb58  5f 00 00 00 00 00 00 00-fe ff ff ff ff ff ff ff  _...............
00000081`71b2fb68  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00000081`71b2fb78  38 fb b2 71 81 00 00 00-00 00 00 00 00 00 00 00  8..q............
00000081`71b2fb88  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00000081`71b2fb98  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00000081`71b2fba8  fb f6 00 70 f9 7f 00 00-00 b3 1e 70 f9 7f 00 00  ...p.......p....
  • [0:8] : Unknown(stores the address) -> that points to same address 00000081`71b2fb38

  • [8:16] : PayloadAddress

  • [16:24] : Unknown (NULL)

  • [24:32] : PayloadSize

  • [32:40] : Allocated Size (aligned with power of 2)

  • Payload Address: 0x020242e757d0e

  • Payload Size: 0x52

0:000> db 0242e257d7e0
00000242`e257d7e0  a8 ab ae b7 a9 b7 a9 b7-a8 b9 b4 b9 f3 f8 f7 fc  ................
00000242`e257d7f0  b9 c2 ab a8 b6 d8 e9 eb-b6 ab a9 ab aa a3 a8 aa  ................
00000242`e257d800  a3 a9 ac a3 a8 a8 b9 b4-a9 ae a9 a9 c4 b9 de dc  ................
00000242`e257d810  cd b9 b6 b9 f0 f7 fd fc-e1 b7 f1 ed f4 f5 b9 d1  ................
00000242`e257d820  cd cd c9 b9 b6 b9 a8 b7-a8 b9 ab a9 a9 b9 ab aa  ................
00000242`e257d830  ab af 00 cd cd cd cd cd-cd cd cd cd cd cd cd cd  ................
00000242`e257d840  fd fd fd fd 00 00 00 00-c3 54 17 34 00 0d 00 8c  .........T.4....
00000242`e257d850  d0 c9 57 e2 42 02 00 00-a0 aa 57 e2 42 02 00 00  ..W.B.....W.B...
0:000> db 0242e257d7e0 L52
00000242`e257d7e0  a8 ab ae b7 a9 b7 a9 b7-a8 b9 b4 b9 f3 f8 f7 fc  ................
00000242`e257d7f0  b9 c2 ab a8 b6 d8 e9 eb-b6 ab a9 ab aa a3 a8 aa  ................
00000242`e257d800  a3 a9 ac a3 a8 a8 b9 b4-a9 ae a9 a9 c4 b9 de dc  ................
00000242`e257d810  cd b9 b6 b9 f0 f7 fd fc-e1 b7 f1 ed f4 f5 b9 d1  ................
00000242`e257d820  cd cd c9 b9 b6 b9 a8 b7-a8 b9 ab a9 a9 b9 ab aa  ................
00000242`e257d830  ab af  
hex_bytes = [
    0xa8, 0xab, 0xae, 0xb7, 0xa9, 0xb7, 0xa9, 0xb7,
    0xa8, 0xb9, 0xb4, 0xb9, 0xf3, 0xf8, 0xf7, 0xfc,
    0xb9, 0xc2, 0xab, 0xa8, 0xb6, 0xd8, 0xe9, 0xeb,
    0xb6, 0xab, 0xa9, 0xab, 0xaa, 0xa3, 0xa8, 0xaa,
    0xa3, 0xa9, 0xac, 0xa3, 0xa8, 0xa8, 0xb9, 0xb4,
    0xa9, 0xae, 0xa9, 0xa9, 0xc4, 0xb9, 0xde, 0xdc,
    0xcd, 0xb9, 0xb6, 0xb9, 0xf0, 0xf7, 0xfd, 0xfc,
    0xe1, 0xb7, 0xf1, 0xed, 0xf4, 0xf5, 0xb9, 0xd1,
    0xcd, 0xcd, 0xc9, 0xb9, 0xb6, 0xb9, 0xa8, 0xb7,
    0xa8, 0xb9, 0xab, 0xa9, 0xa9, 0xb9, 0xab, 0xaa,
    0xab, 0xaf
]

for byte in hex_bytes:
    xor_result = byte ^ 0x99
    print(chr(xor_result), end='')  

Output

127.0.0.1 - jane [21/Apr/2023:13:05:11 -0700] GET / index.html HTTP / 1.1 200 2326

Debugger Output Line

        00000081`71b2f610 00007ff7`c2929cfd     : 00000000`000000d8 00000081`71b2f958 00000081`71b2fb40 00000000`00000053 : DebugApplication!hIsWriteable+0xd6
  • Handle Value : 00000000`000000d8
  • Payload: 00000081`71b2f958
0:000> db 00000081`71b2f958
00000081`71b2f958  90 cb 57 e2 42 02 00 00-60 df 57 e2 42 02 00 00  ..W.B...`.W.B...
00000081`71b2f968  00 00 00 00 00 00 00 00-52 00 00 00 00 00 00 00  ........R.......
00000081`71b2f978  5f 00 00 00 00 00 00 00-00 00 91 c2 00 7f 00 00  _...............
00000081`71b2f988  00 e0 04 00 00 00 00 00-00 00 00 01 01 00 00 00  ................
00000081`71b2f998  58 f9 b2 71 81 00 00 00-c0 d9 57 e2 42 02 00 00  X..q......W.B...
00000081`71b2f9a8  58 f9 b2 71 81 00 00 00-9f a0 95 c2 f7 7f 00 00  X..q............
00000081`71b2f9b8  40 fb b2 71 81 00 00 00-f0 f9 b2 71 81 00 00 00  @..q.......q....
00000081`71b2f9c8  01 aa 92 c2 f7 7f 00 00-38 fb b2 71 81 00 00 00  ........8..q....


0:000> db poi(00000081`71b2f958+0x8)
00000242`e257df60  a8 ab ae b7 a9 b7 a9 b7-a8 b9 b4 b9 f3 f8 f7 fc  ................
00000242`e257df70  b9 c2 ab a8 b6 d8 e9 eb-b6 ab a9 ab aa a3 a8 aa  ................
00000242`e257df80  a3 a9 ac a3 a8 a8 b9 b4-a9 ae a9 a9 c4 b9 de dc  ................
00000242`e257df90  cd b9 b6 b9 f0 f7 fd fc-e1 b7 f1 ed f4 f5 b9 d1  ................
00000242`e257dfa0  cd cd c9 b9 b6 b9 a8 b7-a8 b9 ab a9 a9 b9 ab aa  ................
00000242`e257dfb0  ab af 00 cd cd cd cd cd-cd cd cd cd cd cd cd cd  ................
00000242`e257dfc0  fd fd fd fd 00 00 00 00-04 00 00 00 00 7a 00 00  .............z..
00000242`e257dfd0  f0 00 56 e2 42 02 00 00-f0 00 56 e2 42 02 00 00  ..V.B.....V.B...