summaryrefslogtreecommitdiff
path: root/other/burneye2/doc/BUGS.FIXED
blob: ab10605d53bbd2028150014c605b80c04f9c8a9a (plain)
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

2003/04/07, critical, Assertion failed
=============================================================================

fixed: temporarily dismissed, as the input code is very very weird on its own.
	basically, what is happening is a code fragment like this:

	0x00000192 5f                 pop     edi
	0x00000193 c9                 leave
	0x00000194 e9fcffffff         jmp     0x195
                     ^ s     ^ e
	0x00000199 83ec0c             sub     esp, 0xc
	0x0000019c 6a02               push    0x2
	0x0000019e e8fcffffff         call    0x19f

	for the instruction at 0x194 there is no relocation entry, hence the
	jump is correctly parsed to land in 0x195, which results in a new
	basic block being created. of course there is no valid control
	instruction and upon block extension the displ_relofs != 0 assertion
	fails as this is no valid instruction. review this bug later, if more
	of such code is experienced.

reproduce:
	./objobf -e bug-1.o

expected behaviour:
	output.o being written

observed behaviour:
	objobf: objwriter.c:1452: bblock_fixup_end_single: Assertion `displ_relofs != 0' failed.


2003/03/31, critical, Assertion failed
=============================================================================

fixed: 2003/04/01
	there were *common sections, which have to be resolved using
	"ld -q -r -o object-temp.o object.o" pass. added a manpage note about
	this. also fixed switchtable detection bugs which were found while
	tracking this.

reproduce:
	testcases/3-real$ ../../objobf -v 3 -e 7350wurm.o  

expected behaviour:
	obfuscation

observed behaviour:
	codepair: .text / .rel.text with .symtab
	adding 20 items to 0 items long list
	objobf: func_handling.c:526: relocate_data: Assertion `rel->sym->sec != ((void
		*)0)' failed.
	Aborted


2003/03/29, critical, Invalid instruction encountered
=============================================================================

fixed: 2003/04/01
	ia32_decode_opcode assigned the source/target operand size as size of
	the displacement, while the displacement should be guided by the
	address size (which can be changed with the 0x67 prefix). hence, we
	use the wide_addr_cur size to figure the displacment length. this
	resulted in an instruction being recognized as being too short.

reproduce:
	./objobf -v 3 objwriter-bug1.o

expected behaviour:
	proper processing of function "obj_write".

observed behaviour:
                (0x08067be6) 0x0000098e: or     dword [edi], eax
                (0x08067be8) 0x00000990: or     al, ch
                (0x08067bea) 0x00000992: cld
error, no opc structure found :(
WARNING: (ia32_func_breakup_2) failed to decode instruction at 0x00000993, in function "obj_write"



2003/03/29, must-fix, switch statement linearization
=============================================================================

fixed: 2003/03/31
	quite straight forward linearization by direct memory write into
	.rodata section.

reproduce:
	./objobf switch.o

expected behaviour:
	proper linearization to output.o

observed behaviour:
	objobf: objwriter.c:1079: bblock_fixup_end: Assertion `0' failed.



2003/03/29, must-fix, invalid (bogus) loops detected
=============================================================================

fixed: 2003/03/30, unfixable
	the problem is not fixable without extensive loop analysis, which is
	not to be implemented. see section 10.4, pp. 605 of the dragon book.

	2003/03/31, addendum: provide both algorithms and make the user select
	the proper one (-n or -N option)

reproduce:
	./objobf -n -c ia32_func_breakup ia32/ia32-function.o &&
		aisee.bin -color -psoutput output.ps output.vcg &&
		gv output.ps

expected behaviour:
	two distinct loops being detected

observed behaviour:
	one distinct and three nested loops detected



2003/03/29, must-fix, loop-marked CFG's hard to read
=============================================================================

fixed: 2003/03/29
	using clustered subgraphs instead of boxed ones and by adding
	increasing vertical_order attributes to nodes in subgraphs based on
	the level and whether it is the head node of a loop.

reproduce:
	./objobf -n -c quicksort testcases/quicksort.o

expected behaviour:
	control flow edges from outside into a loop or from inside to outside
	the loop are clearly displayed as such.

observed behaviour:
	edges are lead to boxed subgraphs, not to the edges contained in them