-
Notifications
You must be signed in to change notification settings - Fork 15
/
21zero.html
142 lines (94 loc) · 3.07 KB
/
21zero.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE>21 СПОСОБ ОБНУЛИТЬ РЕГИСТР</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</HEAD>
<BODY bgcolor=#C0C0C0 text=#000000>
<pre>
21 СПОСОБ ОБНУЛИТЬ РЕГИСТР
~~~~~~~~~~~~~~~~~~~~~~~~~~
Как-то ночью, от нехуй делать был написан это текст. Здесь приводятся
всякие способы обнуления регистров - от простых и до самых изощренных, но
вот чего тут нет - так это полных извращений, типа обнуления по одному
биту, автогенерируемого кода и т.п.
1. Обнуление MOV-ом
mov r, 0
2. Заменяем MOV на эквивалентные ему PUSH и POP
push <something-equal-to-0>
pop r
3. Самый хакерский способ: вычитаем регистр сам из себя.
sub r, r
4. Ксорим (тоже неплохой способ... но... как-то не то...)
Попутно (c) на название картины: "арвихакер, ксорящий ворды в уме"
xor r, r
5. Тоже неплохой способ, правда нахуй никому не нужный.
and r, 0
6. Более хитро: умножим на 0.
imul r, 0
7. Сдвиг (не путать со спрыгом).
X1+X2 в сумме больше/равно размера регистра в битах,
по отдельности меньше. Меньше потому, что берется по модулю.
shr/shl/sal r, X1 ; X1<=31, X2<=31, X1+X2>=32
shr/shl/sal r, X2 ;
8. Более извратный сдвиг.
clc
rcr/rcl, X1
clc
rcr/rcl, X2
9. Не совсем честный способ, но...
or reg, -1
inc/not reg
10. Обнулим (E)CX. (хотя так можно и охуеть)
loop $
11. Обнулим EDX.
shr eax,1
cdq
11. Обнулим AL. (AH=AL,AL=0)
aam 1
12. Обнулим AH
aad 0
13. Опять AL
clc
setalc ; opcode: 0xD6
14. Более хитро: прочитаем 0 из порта (например порт 81h)
mov dx, <some-port-number>
in al, dx
15. Опять AL
stc
setnc al
16. А тут кто-нибудь в доку полезет. 5 раз bsf либо bsr.
bsf r, r
bsf r, r
bsf r, r
bsf r, r
bsf r, r
17. Воспользуемся нулевым дескриптором из GDT
sgdt [esp-6]
mov r, [esp-4]
mov r, [r]
18. Считаем ноль из сегмента FS (PE файл)
mov r, fs:[10h] ; константа по вкусу, был бы ноль
19. Цикл (повторюсь: здесь главное не охуеть)
inc/dec r ; это несколько долго
jnz $-1
20. Вызовем какую-нить функцию с кривыми параметрами (вернется NULL в EAX)
call GetCurrentObject
21. Используем сопроцессор
fldz
fistp dword ptr [esp-4]
mov eax, [esp-4]
22, 23, 24, ...
Предлагаются также следующие варианты обнуления регистра:
- сканирование цепочки обработчкиков SEH до победного нуля
- сканирование цепочки хендлов файлов до нуля
(для этого надо сначала положить в регистр хендл открытого файла
нулевого кольца, а перед этим перейти в ноль и открыть этот файл)
- считывание нуля из случайного файла
(потребуется генератор случайных чисел)
- вычисление синуса от Pi * n (умножать командой FMUL)
- сортировка памяти и поиск нуля как минимального элемента
- определение нуля как константы (в исходнике)
- создание специального макроса для генерации нуля
- запуск вируса и подсчет количества оставшихся файлов
...