Obfuscare - problema disassembly
Last Updated: Feb 07 2018 08:33, Started by
Alex99_1
, Apr 22 2017 16:36
·
0
#19
Posted 23 April 2017 - 12:19
Uite un loader si modifica partea de criptare cum vrei:
http://www.cppblog.c...8/08/29574.html https://github.com/c...ter/loadEXE.cpp |
#21
Posted 03 May 2017 - 03:27
Poate sa lase cineva niste exemple de obfuscare binara(gen inlocuirea intructiuni jmp cu altceva care se comporta la fel)?Sau niste carti.
Edited by Alex99_1, 03 May 2017 - 03:34. |
#22
Posted 03 May 2017 - 11:16
Iti las un video, iti descrie procesul pe care o sa il parcurgi, si da, trebuie sa te lupti cu JMP
[ https://www.youtube-nocookie.com/embed/y124L75ZKAc?feature=oembed - Pentru incarcare in pagina (embed) Click aici ] slide-show-ul folosit https://www.defcon.o...g-With-Math.pdf |
#23
Posted 03 May 2017 - 11:22
Alex99_1, on 03 mai 2017 - 03:27, said:
gen inlocuirea intructiuni jmp cu altceva care se comporta la fel |
#24
Posted 03 May 2017 - 17:40
Multumesc de video.
Macar e un inceput. Am sa vad si cu memeoria,deocamdata sa fac ceva sa mearga. |
#25
Posted 13 September 2017 - 09:09
Am reusit sa fac dezasamblarea si sa inlocuiesc call cu push si jmp. Acum ma confrunt cu problema encodarii..nu prea inteleg cum este syntaxa la stringul dat spre encodare. Poate cineva sa-mi dea niste hinturi sau ceva exemple?
|
#26
Posted 13 September 2017 - 10:06
salut,
in atasament am pus un program mic care afiseaza un mesaj apeland APIul MessageBox dezasamblarea acestui program este urmatoarea: instructiune (echivalent hex) XOR EAX,EAX (31C0) PUSH EAX (50) CALL program1.00401009 (E8 01000000) RETN (C3) PUSH EBP (55) MOV EBP,ESP (89E5) PUSH DWORD PTR SS:[EBP+8] (FF75 08) PUSH program1.00403009 (68 09304000) ; Titlu = "TITLU" PUSH program1.00403000 (68 00304000) ; Text = "CONTINUT" PUSH DWORD PTR SS:[EBP+8] (FF75 08) CALL DWORD PTR DS:[<&USER32.MessageBoxA>] (FF15 3C204000) LEAVE (C9) RETN 4 (C2 0400) 00 DB 00 00 DB 00 00 DB 00 00 DB 00 ce trebuie sa faca programul tau acestui program? ce trebuie sa modifice? Attached Files |
#27
Posted 13 September 2017 - 10:22
0x1: XOR EAX,EAX (31C0) 0x2: PUSH EAX (50) 0x3: [b]jmp 0x18[/b] 0x4: RETN (C3) 0x5: PUSH EBP (55) 0x6: MOV EBP,ESP (89E5) 0x7: PUSH DWORD PTR SS:[EBP+8] (FF75 08) 0x8: PUSH program1.00403009 (68 09304000) ; Titlu = "TITLU" 0x9: PUSH program1.00403000 (68 00304000) ; Text = "CONTINUT" 0x10: PUSH DWORD PTR SS:[EBP+8] (FF75 08) 0x11: CALL DWORD PTR DS:[<&USER32.MessageBoxA>] (FF15 3C204000) 0x12: LEAVE (C9) 0x13: RETN 4 (C2 0400) 0x14: 00 DB 00 0x15 00 DB 00 0x16 00 DB 00 0x17 00 DB 00 new section at the end of program: [b]Section obf:[/b] 0x18: push 0x4 ; replace call 401009 0x19: jmp program1.00401009 ; replace call 401009 0x20: int3 0x21: int3 ; next call si tot asa mai departe pentru fiecare call cam asta modific eu. Problema e sa fac encodarea la aceste intructiuni cu xed.. Edited by Alex99_1, 13 September 2017 - 10:25. |
#28
Posted 13 September 2017 - 12:13
daca la encodare te referi la transformarea instructiunilor in echivalentul hex, pt saritura lunga jmp (de exemplu jmp 421000) ai E9 urmat de inca 4 bytes, in total 5 bytes
cei 4 bytes ii calculezi astfel: iei adresa urmatoarei instructiuni de dupa locul unde bagi jmp-ul, o notezi cu adresa1 iei adresa unde vrei sa sari, o notezi cu adresa2 aplici formula: 0 - (adresa1 - adresa2) rezultatul obtinut il transformi in hex cu lungime de 4 bytes si il scrii dupa byteul E9, dar incepand cu byteul al 4-lea, apoi al treilea .. deci in ordine inversa a bytes-urilor pe exemplul concret din atasamentul de mai sus: 00401000 31C0 XOR EAX,EAX ; kernel32.BaseThreadInitThunk 00401002 50 PUSH EAX 00401003 E8 01000000 CALL program1.00401009 00401008 C3 RETN 00401009 55 PUSH EBP 0040100A 89E5 MOV EBP,ESP 0040100C FF75 08 PUSH DWORD PTR SS:[EBP+8] 0040100F 68 09304000 PUSH program1.00403009 ; Titlu "TITLU" 00401014 68 00304000 PUSH program1.00403000 ; Text = "CONTINUT" 00401019 FF75 08 PUSH DWORD PTR SS:[EBP+8] 0040101C FF15 3C204000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>] 00401022 C9 LEAVE 00401023 C2 0400 RETN 4 00401026 00 DB 00 00401027 00 DB 00 00401028 00 DB 00 00401029 00 DB 00 0040102A 00 DB 00 0040102B 00 DB 00 0040102C 00 DB 00 0040102D 00 DB 00 0040102E 00 DB 00 0040102F 00 DB 00 00401030 00 DB 00 00401031 00 DB 00 00401032 00 DB 00 la adresa 401003 ai o instructiune call. vrei sa o inlocuiesti cu un jmp care sa sara la 401028. iei adresa urmatoarei instructiuni de unde bagi jmpul: este 401008. o notezi cu adresa1 iei adresa unde vrei sa sari: este 401028, o notezi cu adresa2 aplici formula: 0 - (401008 - 401028) = 0 - ( -20) = 0 + 20 = 20 20 pe 4 bytes este 00000020 deci la 401003 (unde ai call) vei pune E9 20000000 la adresa 401028 vei pune 'push adresa de intoarcere', care este 401008. 401008 pe 4 bytes este 00401008. push are antet 68. vei urca pe stiva adresa adresa virtuala relativa (RVA) in cazul push-ului, tot in ordine inversa a bytes-urilor. deci vei avea 68 08104000 apoi dedesuptul instructiunii push vrei jmp la codul din call. adresa unde bagi instructiunea de jump este cea de dupa push, adica 40102D. iei adresa urmatoarei instructiuni de unde bagi jmpul: este 40102D+5(jmp lung pe 5 bytes) = 401032. o notezi cu adresa1 iei adresa unde vrei sa sari: callul incepe la 401009. o notezi cu adresa2 aplici formula 0 - (401032 - 401009) = 0 - (29) = -29 = ffffffD7 deci la 401032 vei pune E9 D7ffffff deci vei avea urmatorul cod dupa 'obfuscare': 00401000 31C0 XOR EAX,EAX 00401002 50 PUSH EAX 00401003 E9 20000000 JMP program1.00401028 00401008 C3 RETN 00401009 55 PUSH EBP 0040100A 89E5 MOV EBP,ESP 0040100C FF75 08 PUSH DWORD PTR SS:[EBP+8] 0040100F 68 09304000 PUSH program1.00403009 ; Titlu = "TITLU" 00401014 68 00304000 PUSH program1.00403000 ; Text = "CONTINUT" 00401019 FF75 08 PUSH DWORD PTR SS:[EBP+8] 0040101C FF15 3C204000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>] 00401022 C9 LEAVE 00401023 C2 0400 RETN 4 00401026 00 DB 00 00401027 00 DB 00 00401028 68 08104000 PUSH program1.00401008 0040102D E9 D7FFFFFF JMP program1.00401009 00401032 00 DB 00 |
|
#29
Posted 13 September 2017 - 12:43
Multumesc! Foarte bine explicat. Insa mai este o problema. Eu trebuie sa encodez un fisier cu instructiuni. Fisierul "dis.xml" e cel in care am modificat adresele de la jmp si call( sa fie VA). In fisierul "dis2.xml" e asa cum a decodat xed cu RVA. Instructiuni se pot encoda cu xed dandui doar un string "call_far 0x123456",dar aici e problema ca nu stiu prea bine syntaxa la string. Din cate am mai citit trebuie gen "call_far mem4:eax,12345" insa is in mare dilema cu asta. Inca ceva.Cand in sfarsit o encodez ar trebui cred sa transform adresele din dis.xml asa cum sunt in dis2.xml,adica cum le-a decodat la inceput?
Attached FilesEdited by Alex99_1, 13 September 2017 - 13:04. |
#30
Posted 27 September 2017 - 11:02
Nu mai am nevoie de xed ca sa encodez. O sa le fac manual,dar cum s-ar traduce in hex o instructiune de genu "jmp dword ptr [0xffffff]"?
|
#32
Posted 27 September 2017 - 11:56
Asta am vazut, dar nu stiu cum se calculeaza!
Edited by Alex99_1, 27 September 2017 - 11:56. |
#33
Posted 02 October 2017 - 10:28
Lasand la o partea "JMP" m-am lovit de alta problema. La obfuscare cand fac "push nextAddr" nextAddr nu ceea care trebuie sa programul imi crapa. Am pus ca in exemplul lui politete(am incercat si rva si va),dar nu reusesc si nu inteleg de ce nu e corecta adresa aia..? Any help..
In imagine,daca execut pas cu pas merge,dar daca salvez in executabil si pun din nou in olly crapa.. |
|
#34
Posted 02 October 2017 - 13:24
salut,
daca adaugi sectiuni noi, trebuie sa modifici capul PE-ului in care sa pui informatii despre noua sectiune eventual scrie pas cu pas ce faci + cod |
#35
Posted 02 October 2017 - 14:55
Far enough. In olly daca fac astfel functioneaza,dar daca salvez permanet in executabil imi crapa la rulare.
https://imgur.com/KUFUEEI "lab1_prog.exe" e cel modficat si "lab1_progC.exe" original. https://imgur.com/wRuC0r6 iar in olly cum arata cel modificat. https://imgur.com/8Rs7jtC => jmp in noua sectiune https://imgur.com/AEifwLr iar acolo la retn imi crapa https://imgur.com/7c7Rts3 Si bucati de cod atunci cand scriu instructiunile: [ https://i.imgur.com/3sCUa17.png - Pentru incarcare in pagina (embed) Click aici ] [ https://i.imgur.com/ImJVsO3.png - Pentru incarcare in pagina (embed) Click aici ] 0x400(offset fisier) l-am adaugat raw doar sa vad daca merge NewSect->Characteristics = 0xE00000E0 Edited by Alex99_1, 02 October 2017 - 15:13. |
#36
Posted 02 October 2017 - 17:24
deci iti 'crapa' pt ca daca te uiti in capul stivei (esp) vei vedea ca vrei sa te intorci la 10e8h - are un loc dedicat in olly si anume lista din coltul dreapta-jos. cand esti pe cale de a executa instructiunea ret uita-te in capul stivei ( https://imgur.com/7c7Rts3 )
in imaginea https://imgur.com/AEifwLr tu ai push 0ba5h , dar tie iti trebuie adresa de memorie acolo (eu confund va cu rva ; deci voi spune adresa de memorie la adresa de memorie, si adresa de foaie la adresa pe care o gasesti cu hexeditorul cand programul e pe hard). deci capul stivei (esp) inainte de instructiunea ret trebuie sa contina adresa de memorie unde se va face intoarcerea. totusi, nu stiu exact ce instructiuni executi in sectiune (vad ca compiezi continutul functiilor), insa daca ai facut push la 0ba5h, ar trebui ca capul stivei sa contina tot 0ba5h si nu 10e8h cum arata atunci cand zici ca iti 'crapa' hai sa incercam sa lucram pe programul meu. deci fa modificarile necesare si uploadeaza-l sa imi dau si eu seama mai bine ce modificari ai facut cat despre codul in c in care lucrezi, nu te pot ajuta pt ca nu cunosc c |
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users