public sealed class OverlappingSectionsRule : IValidationRule
{
    public string RuleName => nameof(OverlappingSectionsRule);
    public ValidationSeverity Severity => ValidationSeverity.Error;

    public Task<ValidationResult> ValidateAsync(PeImageInfo peInfo, CancellationToken cancellationToken)
    {
        for (var i = 0; i < peInfo.Sections.Count; i++)
        {
            for (var j = i + 1; j < peInfo.Sections.Count; j++)
            {
                var a = peInfo.Sections[i];
                var b = peInfo.Sections[j];

                var aEnd = a.VirtualAddress + Math.Max(a.VirtualSize, a.SizeOfRawData);
                var bEnd = b.VirtualAddress + Math.Max(b.VirtualSize, b.SizeOfRawData);

                if (a.VirtualAddress < bEnd && b.VirtualAddress < aEnd)
                {
                    return Task.FromResult(new ValidationResult(RuleName, Severity, false, "Overlapping sections detected."));
                }
            }
        }

        return Task.FromResult(new ValidationResult(RuleName, Severity, true, "No overlapping sections detected."));
    }
}