This site is the archived OWASP Foundation Wiki and is no longer accepting Account Requests.
To view the new OWASP Foundation website, please visit https://owasp.org
Manipulating private method behaviour by overriding public virtual methods in public classes
This code shows an interresting example where I was able to control a variable used inside a private member using an overrided virtual method which I controled
The virtual method
System.Collections.ArrayList.set_Capacity
is used in
private System.Void System.Collections.ArrayList::EnsureCapacity(System.Int32)
and can be invoked from (i.e. it isused by)
System.Collections.ArrayList.Add(Object) : Int32 System.Collections.ArrayList.Insert(Int32, Object) : Void System.Collections.ArrayList.InsertRange(Int32, ICollection) : Void
so by overriding the public method I am able to afect the behaviour of a private method (which I don't have access to)
In this example bellow I override the ArrayList's Capacity method which is then invoked by the private method private ArrayList.EnsureCapacity (which was invoked by the public method ArrayList.Add)
using System; using System.IO; using System.Reflection; namespace Owasp {
class myOverride : System.Collections.ArrayList { public override int Capacity { set { Console.WriteLine("Inside myOverride.set_Capacity (the method under our control)"); base.Capacity = base.Capacity+1; Console.WriteLine("\n Current Stack trace (note that System.Collections.ArrayList.EnsureCapacity(Int32 min) is a private method)\n"); Console.WriteLine(new System.Diagnostics.StackTrace().ToString()); } get { Console.WriteLine("Inside myOverride.get_Capacity"); return base.Capacity; } } public override string ToString() { Console.WriteLine("ToString() invoked"); return base.ToString(); } } class ArrayCapacity_Test { public static void Main() { System.Collections.ArrayList myOver = new myOverride(); try { myOver.Add("test"); // Console.WriteLine(myOver.Capacity); } catch (Exception Ex) { Console.WriteLine(Ex.Message); Console.WriteLine(Ex.StackTrace); } } } }
(from Reflector) sourcecode of private System.Void System.Collections.ArrayList::EnsureCapacity(System.Int32)
private void EnsureCapacity(int min) { if (this._items.Length < min) { int num1 = (this._items.Length == 0) ? 0x10 : (this._items.Length * 2); if (num1 < min) { num1 = min; } this.Capacity = num1; } }
(from Reflector) sourcecode of private System.Void System.Collections.ArrayList::Add(System.object)
public virtual int Add(object value) { if (this._size == this._items.Length) { this.EnsureCapacity(this._size + 1); } this._items[this._size] = value; this._version++; return this._size++; }