Solution:
1. Use CFF Explorer to remove .reloc data section
Knowing what is .reloc
data:
- It contains data which allows the PE file to be loaded at different address each time it is executed (.reloc = relocation)
- It contains pointers to functions or variables
- It also has address references for dynamic linking or imported functions
Reason to remove .reloc
data:
- Improving debugging behavior
- Easier to analyze
References on PE Base Relocations: https://0xrick.github.io/win-internals/pe7/
2. Use IDA to diassemble and identify suitable breakpoints
From the decompiled C pseudocode:
GetDlgItemTextA(hWnd, 1000, lpString, 90); // -> Input text function, lpString will store the input
v9 = (unsigned __int16)sub_4036C0(&unk_41A4FC); // -> v9 stores the result of sub_40360 (Breakpoint #1)
if ( v9 == (unsigned __int16)sub_403A20(lpString, strlen(lpString)) && strlen(lpString) > 0xF ) // -> Checks lpString matches the value of v9 and length is more than 15
Since there is a function call, we have to inspect deeper into sub_40360
3. Dive deeper into sub_4036C0
The operation of sub_4036C0
is loop through character byte array with XOR 0x53
and returns it as v9
. Next, we should set the second breakpoint when it return. The return value will be stored in EAX register.
4. Use x32dbg to set breakpoints and check the EAX value at the second breakpoint
After place the breakpoint, run it, it will hit the Prologue breakpoint. Input a test string like AAAAAAAA
.
When you click Check
button, it will hit the first breakpoint.
Hit next again, it will complete the sub_4036C0
process execution, it will store the result into EAX.
To verify more, we can follow in follow in dump, just right click and Follow in Dump
Flag: This message is encrypted with blowfish