|
| 1 | +<html> |
| 2 | +<head> |
| 3 | +<title>tmp.0ut</title> |
| 4 | +<meta charset="utf-8"> |
| 5 | +<style> |
| 6 | + body { |
| 7 | + color: #FEFEFE; |
| 8 | + background-color: #0c0d10; |
| 9 | + margin: 0 auto; |
| 10 | + padding: 1em 0 1em 0; |
| 11 | + } |
| 12 | + |
| 13 | + @font-face { font-family: "gohu"; src: url("gohu.woff") format('woff'); } |
| 14 | + @font-face { font-family: "FreeMono"; src: url("FreeMono.woff") format('woff'); } |
| 15 | + |
| 16 | + pre { font-size: 14px; line-height: 1.0; } |
| 17 | + |
| 18 | + .ltr { |
| 19 | + direction: ltr; |
| 20 | + text-align: left; |
| 21 | + font-family: "gohu", "Lucida Console", monospace, Monaco; |
| 22 | + } |
| 23 | + |
| 24 | + .rtl { |
| 25 | + direction: rtl; |
| 26 | + text-align: right; |
| 27 | + font-family: "FreeMono", "Lucida Console", monospace, Monaco; |
| 28 | + } |
| 29 | + |
| 30 | + a { color: #93ffd7; text-decoration: none;} |
| 31 | +</style> |
| 32 | +</head> |
| 33 | +<body> |
| 34 | +<center> |
| 35 | +<div style="display: inline-block;"><pre class="rtl"> |
| 36 | + ┐───────────────────────┌ |
| 37 | + │ ▄▄▄▄▄ ▄▄▄▄▄ ▄▄▄▄▄ |
| 38 | + │ █ █ █ █ █ █ │ |
| 39 | + │ ▀▀▀▀█ █ █ █ █ │ |
| 40 | + │ ▄ █ █ █ █ │ |
| 41 | + │ ▄▄▄▄▄ │ |
| 42 | + │ █ █ │ |
| 43 | + │ █ █ │ |
| 44 | + │ █▄▄▄█ │ |
| 45 | + │ ▄ ▄ │ |
| 46 | + │ █ █ │ |
| 47 | + │ █ █ │ |
| 48 | + │ █▄▄▄█ │ |
| 49 | + │ ▄▄▄▄▄ │ |
| 50 | + │ █ │ |
| 51 | +דיסאסמבלי-שגוי פולימורפית │ █ │ |
| 52 | +~ S01den ┘───█───────────────────└ |
| 53 | + |
| 54 | +נכתב באהבה ע"י S01den, מהצוות של tmp.out ! |
| 55 | +mail: S01den@protonmail.com |
| 56 | + |
| 57 | +[ תורגם ע"י Lit3r4lly ] |
| 58 | + |
| 59 | +--- הקדמה --- |
| 60 | + |
| 61 | +כשכתבתי את [0]<span dir="ltr">Lin32.Bakunin</span>, תהיתי לעצמי איך לעשות את זה יותר מעניין |
| 62 | +מסתם וירוס שכתוב ב-MIPS ומדפיס קצת שטויות. אני פשוט רציתי לעצבן רברסרים. |
| 63 | +ואז נזכרתי בטכניקת ה-False-Disassembly שמימשתי בחלק מה-crackme's שלי. |
| 64 | + |
| 65 | +בגלל שפולימורפיזם זה מגניב, רציתי להבין אם זה אפשרי ליצור משהו מעניין בעזרת ערבוב של זה יחד עם |
| 66 | +טכניקת ה-False-Disassembly. |
| 67 | + |
| 68 | +התשובה היא כן, וקראתי לשיטה הזו (אני לא יודע אם זו טכניקה מקורית שלי או לא), שיטת |
| 69 | +ה-"דיסאסמבלי-שגוי פולימורפית" או בפשטות "פולימורפיזם מזוייף". |
| 70 | + |
| 71 | +--- איך False-Disassembly עובד? --- |
| 72 | + |
| 73 | +הטכניקה הזו היא די פשוטה להבנה ולמימוש, ואני גיליתי עליה במסמך המפורסם של [1]<span dir="rtl">Silvio Cesare</span> על |
| 74 | +טכניקות anti-debugging ורברסינג בלינוקס. |
| 75 | +פשוט צריך לשים כמה בייטים רנדומליים שבד"כ מייצגים התחלה של הוראה מסויימת (Opcode) לפני קטע הקוד, |
| 76 | +כמו בדוגמה הבאה: |
| 77 | + |
| 78 | +<pre class="ltr"> |
| 79 | +-------------------- נחתך-כאן -------------------- |
| 80 | +hey: hey: |
| 81 | + xor %rbx, %rbx .ascii "\x48\x31" |
| 82 | + jmp yo ====> xor %rbx, %rbx |
| 83 | + jmp yo |
| 84 | +---------------------------------------------------</pre> |
| 85 | +<pre class="rtl"> |
| 86 | +עכשיו, אם נסתכל על שני קטעי הקוד שעברו disassemble, אנחנו נקבל משהו כזה (radare2 מה לעזעזאל?):</pre> |
| 87 | +<pre class="ltr"> |
| 88 | +-------------------- נחתך-כאן -------------------- |
| 89 | +;-- hey: |
| 90 | +0x00401002 4831db xor rbx, rbx |
| 91 | +0x00401005 eb02 jmp 0x401009 |
| 92 | + |
| 93 | + || |
| 94 | + \/ |
| 95 | +;-- hey: |
| 96 | +0x00401002 48314831 xor qword [rax + 0x31], rcx |
| 97 | +0x00401006 dbeb fucomi st(3) |
| 98 | +0x00401008 026631 add ah, byte [rsi + 0x31] |
| 99 | + |
| 100 | +---------------------------------------------------</pre> |
| 101 | +<pre class="rtl"> |
| 102 | +מדוע הדיסאסמבלר מתנהג בצורה הזו? |
| 103 | + |
| 104 | +ובכן, <span dir="ltr">\x48\x31</span> הם בד"כ ייצוג של ההתחלה של הוראת [2]<span dir="rtl">xor</span>, והבייטים שבאים לאחר מכן מייצגים לרוב את |
| 105 | +האוגרים שאיתם האופרציה עובדת. |
| 106 | + |
| 107 | +אז למעשה הבייטים ה"מאתחלים" הללו שהוספנו נדבקים לבייטים העוקבים, שהם למעשה בעצמם בייטים "מאתחלים", וכך |
| 108 | +הדיסאסמבלר מפרש את אותם בייטים מאתחלים באמת, כבייטים המייצגים את הרגיסטרים ובגלל זה מופיע לנו זבל במקום ההוראות הרצויות. |
| 109 | + |
| 110 | +לכן, כדי שנוכל להריץ קוד שבנוי בצורה שכזו, אנחנו חייבים לקפוץ מעל הבייטים שהוספנו. |
| 111 | +זה אמור להיות משהו כזה: |
| 112 | +</pre> |
| 113 | +<pre class="ltr"> |
| 114 | +-------------------- נחתך-כאן -------------------- |
| 115 | +_start: |
| 116 | +jmp hey+2 |
| 117 | + |
| 118 | +hey: |
| 119 | + .ascii "\x48\x31" |
| 120 | + xor %rbx, %rbx |
| 121 | + jmp yo |
| 122 | +--------------------------------------------------- |
| 123 | +</pre> |
| 124 | +<pre class="rtl"> |
| 125 | +--- הקוד המלא --- |
| 126 | + |
| 127 | +עכשיו, דמיינו שאתם יכולים רנדומלית לשנות את כל הבייטים הללו שמייצרים את ה-false-disassembly בכל |
| 128 | +אופרציה, וכך גם הקוד שעבר disassembly ישתנה גם ולכן הרברסר |
| 129 | +שיחקור את הקוד, יחשוב שהוא פולימורפי בזמן שרק מספר בייטים בודדים שונו. |
| 130 | + |
| 131 | +וכעת, ללא דיחוי נוסף, הקוד המלא. |
| 132 | +</pre> |
| 133 | +<pre class="ltr"> |
| 134 | +----------- נחתך כאן ----------- |
| 135 | +# build cmd: as Linux.FakePolymorphism.asm -o fakePoly.o ; ld fakePoly.o -o fakePoly |
| 136 | + |
| 137 | +# this code is a fake polymorphic example, feel free to try/use/whatever it! |
| 138 | +# It grabs itself its code, modify the fake-disassembly bytes and put the result |
| 139 | +# on the stack. |
| 140 | + |
| 141 | +.text |
| 142 | + .global _start |
| 143 | + |
| 144 | +_start: |
| 145 | +jmp true_start+2 # jump over the fake-disassembly bytes |
| 146 | + |
| 147 | +true_start: |
| 148 | +.ascii "\x48\x31" # fake-disassembly bytes |
| 149 | +xor %rbx, %rbx |
| 150 | +jmp get_code+2 # jump over the fake-disassembly bytes |
| 151 | + |
| 152 | +get_code: |
| 153 | + .ascii "\x66\x31" # fake-disassembly bytes |
| 154 | + call get_rip |
| 155 | + sub $0x10 ,%rax # 0x10 is the number of bytes between _start abd this instruction |
| 156 | + movb (%rax,%rbx), %al |
| 157 | + movb %al, (%rsp,%rbx) |
| 158 | + inc %rbx |
| 159 | + cmp $0x54, %rbx # 0x54 is the total size of this code |
| 160 | + jne get_code+2 |
| 161 | + |
| 162 | + # Pseudo RNG thanks to the time stamp counter |
| 163 | + rdtsc |
| 164 | + xor $0xdead, %rax |
| 165 | + mov %ax, 2(%rsp) |
| 166 | + xor $0xbeef, %rdx |
| 167 | + mov %ax, 9(%rsp) |
| 168 | + |
| 169 | + mov $60, %rax |
| 170 | + mov $0, %rdi |
| 171 | + syscall # sys_exit |
| 172 | + |
| 173 | +get_rip: |
| 174 | + mov (%rsp), %rax |
| 175 | + ret |
| 176 | +----------------------------</pre> |
| 177 | +<pre class="rtl"> |
| 178 | +--- סיכום --- |
| 179 | + |
| 180 | +אני מקווה שנהנתם מהמאמר הזה ושתנסו לממש את הטכניקה הזו בוירוסים והcrackme's שלכם! |
| 181 | + |
| 182 | +ביחד עם sblip, כתבנו וירוס פולימורפי (Lin64.Eng3ls, תעיפו מבט על המאמר והקוד !) שמשתמש בטכניקה |
| 183 | +הזו בשביל לערפל את הקוד של המפענח של עצמו. |
| 184 | + |
| 185 | +הקוד של המפענח: |
| 186 | +</pre> |
| 187 | +<pre class="ltr"> |
| 188 | +------- נחתך-כאן ------- |
| 189 | + pop rcx |
| 190 | + jmp jmp_over+2 |
| 191 | + jmp_over: |
| 192 | + db `\x48\x31` ; false disassembly |
| 193 | + mov al,0x00 |
| 194 | + xor rdx, rdx |
| 195 | + |
| 196 | + decoder: |
| 197 | + jmp jmp_over2+2 |
| 198 | + |
| 199 | + jmp_over2: |
| 200 | + db `\xb8\xd9` ; false disassembly |
| 201 | + mov dl, byte [r12+rdi] |
| 202 | + cmp rdi, STUB_SIZE-1 |
| 203 | + jna no_decrypt |
| 204 | + |
| 205 | + jmp jmp_over3+2 |
| 206 | + jmp_over3: |
| 207 | + db `\x48\x81` ; false disassembly |
| 208 | + xor dl, al |
| 209 | + |
| 210 | + no_decrypt: |
| 211 | + mov byte [rbx+rdi], dl |
| 212 | + inc rdi |
| 213 | + loop decoder |
| 214 | +-------------------------</pre> |
| 215 | +<pre class="rtl"> |
| 216 | +והנה מספר מפענחים שהבאתי מבינארים זדוניים שונים שעברו [3]<span dir="rtl">disassemble</span>, בוא נראה את הטריק בפעולה:</pre> |
| 217 | +<pre class="ltr"> |
| 218 | +1. |
| 219 | + 0x0c003f46 59 pop rcx |
| 220 | + 0x0c003f47 eb02 jmp 0xc003f4b |
| 221 | + 0x0c003f49 00d6 add dh, dl |
| 222 | + 0x0c003f4b b06d mov al, 0x6d |
| 223 | + 0x0c003f4d 4831d2 xor rdx, rdx |
| 224 | + 0x0c003f50 eb02 jmp 0xc003f54 |
| 225 | + 0x0c003f52 1aca sbb cl, dl |
| 226 | + 0x0c003f54 418a143c mov dl, byte [r12 + rdi] |
| 227 | + 0x0c003f58 4881ff870000. cmp rdi, 0x87 |
| 228 | + 0x0c003f5f 7606 jbe 0xc003f67 |
| 229 | + 0x0c003f61 eb02 jmp 0xc003f65 |
| 230 | + 0x0c003f63 c0d630 rcl dh, 0x30 |
| 231 | + 0x0c003f66 c28814 ret 0x1488 |
| 232 | + 0x0c003f69 3b48ff cmp ecx, dword [rax - 1] |
| 233 | + 0x0c003f6c c7 invalid |
| 234 | + 0x0c003f6d e2e1 loop 0xc003f50 |
| 235 | + |
| 236 | +2. |
| 237 | + 0x0c003fe6 59 pop rcx |
| 238 | + 0x0c003fe7 eb02 jmp 0xc003feb |
| 239 | + 0x0c003fe9 ce invalid |
| 240 | + 0x0c003fea 0ab0a34831d2 or dh, byte [rax - 0x2dceb75d] |
| 241 | + 0x0c003ff0 eb02 jmp 0xc003ff4 |
| 242 | + 0x0c003ff2 39cb cmp ebx, ecx |
| 243 | + 0x0c003ff4 418a143c mov dl, byte [r12 + rdi] |
| 244 | + 0x0c003ff8 4881ff870000. cmp rdi, 0x87 |
| 245 | + 0x0c003fff 7606 jbe 0xc004007 |
| 246 | + 0x0c004003 0e invalid |
| 247 | + 0x0c004004 0a30 or dh, byte [rax] |
| 248 | + 0x0c004006 c28814 ret 0x1488 |
| 249 | + 0x0c004009 3b48ff cmp ecx, dword [rax - 1] |
| 250 | + 0x0c00400c c7 invalid |
| 251 | + 0x0c00400d e2e1 loop 0xc003ff0</pre> |
| 252 | +<pre class="rtl"> |
| 253 | +התוצאות שונות מאוד מהקוד המקורי. |
| 254 | + |
| 255 | +--- הערות ורפרנסים ---</pre> |
| 256 | +<pre class="ltr"> |
| 257 | +[0] https://vx-underground.org/papers/VXUG |
| 258 | + /Exclusive/Bakounin/Writing_virus_in_MIPS_assembly_for_fun.txt |
| 259 | +[1] http://www.ouah.org/linux-anti-debugging.txt // Silvio המסמך של |
| 260 | +[2] https://www.felixcloutier.com/x86/xor |
| 261 | +[3] radare2 עם |
| 262 | +</pre> |
| 263 | +</div></center></body></html> |
0 commit comments