Comments 44
в A переопределен метод GetType()
+1
Это что то вроде «при желании у меня любой тест заработает» ;)
+2
Возможно когда одно поле обычное, а второе имеет статический эквивалент?
0
«A» должен быть структурой
+9
Получилось когда поле с объявлено два раза на русском и англ. =)
+4
public class X
{
public int b;
public int c;
}
public class A : X
{
public int b { get; set; }
public int c { get; set; }
}
при этом студия честно предупреждает о том, что поля родительского класса скрыты
+4
Пометить поля a и b в классе A атрибутом
[FieldOffset(0)]
+3
Вообще тема с FieldOffset заслуживает отдельного топика и иследования, но лень с этим возиться. Вот кстати еще один очень интересный пример использования
using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication26 {
class Program {
static void Main(string[] args) {
var testString = "habrahabr";
Console.WriteLine(testString.Length); // out: 9
var shell = new StringShell();
shell.str = testString;
Console.WriteLine(shell.hack/*ссылка на Bytes*/.GetType());
// GetType врет ?) out: System.String
// ну и самое интересное, не является ли это уязвимостью?
shell.hack.b0 = 143;
Console.WriteLine(testString.Length); // Ахтунт! out: 143
// А если еще сделать так
Console.WriteLine(testString); // out: %содержимое кучи%
}
}
// интересная особенность, StructLayout работает для классов
[StructLayout(LayoutKind.Explicit)]
public class StringShell {
[FieldOffset(0)]
public String str;
[FieldOffset(0)]
public Bytes hack;
}
// сюда можно добавить столько полей,
// на сколько мы хотим пролезть "вглубь" кучи
// далее расположения "хакнутого" объкта
public class Bytes {
public byte b0;
public byte b1;
public byte b2;
public byte b3;
public byte b4;
public byte b5;
public byte b6;
public byte b7;
}
}
+6
Самое интересное, что если компилить C# 3.5, то все работает как положено:
H:\Visual Studio 2005\Projects>test_heap.exe
9
System.String
9
habrahabr
А вот если 4.0 то да, дыра…
H:\Visual Studio 2005\Projects>test_heap.exe
9
System.String
9
habrahabr
А вот если 4.0 то да, дыра…
0
class A
{
public int b, c;
public A GetType()
{
return this;
}
public A GetField(string value)
{
return this;
}
public void SetValue(A instance, int value)
{
// Nothing here
}
}
0
Еще есть вариант с using Assert = MyAssert
+1
когда тип полей bool?
-1
UFO just landed and posted this here
По порядку появления в голове:
1. Структура
2. [FieldOffset]
3. Поле Assert со своим Equal()
4. Переопределение полей как свойств
В в голове не появились (было выше):
5. Переопределение GetType
6. Тред с перезаписью значений
1. Структура
2. [FieldOffset]
3. Поле Assert со своим Equal()
4. Переопределение полей как свойств
В в голове не появились (было выше):
5. Переопределение GetType
6. Тред с перезаписью значений
0
Можно предположить, что A является структурой.
Тогда такое поведение возможно.
Тогда такое поведение возможно.
0
Глядя на такой код, хочется спеть хором с Роем Ошеровым www.youtube.com/watch?v=b2m7Fm1I1HU
-1
Что-то я не понял, в чем сложность…
class A
{
public int b { get { return 42; } set {} }
public int c { get { return 42; } set {} }
}
-2
Sign up to leave a comment.
Задачка по C#