рдЧреЗрдВрдбрд╛ рдЗрдВрдЬрди рдХреЗ рд╕рд╛рде рдкрд╣рд▓рд╛ рдХрджрдо

рдЬрдм рд╣рдмрд░ рдкрд░ "рдпреВрдирд┐рдХреЙрд░реНрди рдЗрдВрдЬрди" рдХреА рдЦреЛрдЬ рдХреА, рддреЛ рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдХрд░ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ рдпрд╣ рдЙрдкрдХрд░рдг рдХрднреА рд▓реЗрдЦреЛрдВ рдореЗрдВ рдЪрд┐рддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рд╢реВрдиреНрдп рдХреЛ рднрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдЖрдЗрдП рдореВрд▓ рдмрд╛рддреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдПрдореБрд▓реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рдкрд╣рд┐рдпрд╛ рдХреЛ рд╕реБрджреГрдврд╝ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдмрд╕ рдЗрд╕ рдореИрдиреБрдЕрд▓ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдореЗрд░реА рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдпрд╛ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдВрдЧреА ред


рдПрдХ рдЧреЗрдВрдбрд╛ рдЗрдВрдЬрди рдХреНрдпрд╛ рд╣реИ?


рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЦреБрдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЧреЗрдВрдбрд╛ рдЗрдВрдЬрди рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЧреЗрдВрдбрд╛ рдЗрдВрдЬрди:


рдпреВрдирд┐рдХреЙрд░реНрди рдПрдХ рд╣рд▓реНрдХрд╛, рдорд▓реНрдЯреА-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдФрд░ рдорд▓реНрдЯреА-рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдПрдореБрд▓реЗрдЯрд░ рд╣реИред

рдпрд╣ рдПрдХ рдорд╛рдирдХ рдПрдореБрд▓реЗрдЯрд░ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдпрд╛ рдкреВрд░реЗ рдУрдПрд╕ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЕрдиреБрдХрд░рдг рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдХрдорд╛рдВрдб рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдирд╛, рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд░рд┐рддреНрд░ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдирд╛, рдЖрджрд┐)ред рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдХрд╛ рдорд╛рд░реНрдХрдЕрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрд╡рдпрдВ рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЖрдк рдмрд╕ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрддреЗ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред


рддреЛ рдпрд╣ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ?


  • рд╡рд╛рдпрд░рд╕ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╕рдордп, рдЖрдк рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдП рдмрд┐рдирд╛ рдПрдХрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • CTF рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
  • рдлрд╝рдЬрд╝рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП ред
  • рднрд╡рд┐рд╖реНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреАрдбреАрдмреА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рднрд╡рд┐рд╖реНрдп рдХреЗ рд╣реЙрдкреНрд╕ рдпрд╛ рд░рдЬрд┐рд╕реНрдЯрд░ рдореВрд▓реНрдпред
  • рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рд╕рдВрдкрдиреНрди рдХреЛрдб рдХрд╛ рдЕрдиреБрдХрд░рдгред

рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?


  • рдкрд╛рдпрдерди рдмрдВрдзрди рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рдЧреЗрдВрдбрд╛ рдЗрдВрдЬрдиред
  • Disassemblerред

рдЙрджрд╛рд╣рд░рдг


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рдирд╛рдо рдХреЗ рддрд╣рдд hxp CTF 2017 рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдп рд▓реЗрдВред рдмрд╛рдЗрдирд░реА рдХреЛ рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред


рдЬрдм рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╣рдорд╛рд░реЗ рдзреНрд╡рдЬ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдзреАрд░реЗ-рдзреАрд░реЗред рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреЗ рдлреНрд▓реИрдЧ рдмрд╛рдЗрдЯ рдХреЛ рдзреАрдорд╛ рдФрд░ рдзреАрдорд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред


The flag is: hxp{F 

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЙрдЪрд┐рдд рд╕рдордп рдореЗрдВ рдзреНрд╡рдЬ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдЖрдИрдбреАрдП рдкреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ ( рдореИрдВрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд░рдбрд╛рд░ 2 + рдХрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ ) рд╣рдордиреЗ рдХреЛрдб рдХреЛ рд╕реА- рд▓рд╛рдЗрдХ рд╕реНрдпреВрдбреЛрдХреЛрдб рдореЗрдВ рдЕрдкрдШрдЯрд┐рдд рдХрд┐рдпрд╛ ред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдХреЛрдб рдареАрдХ рд╕реЗ рд╡рд┐рдШрдЯрд┐рдд рдирд╣реАрдВ рд╣реБрдЖ рдерд╛, рд╣рдо рдЕрднреА рднреА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред


рд╡рд┐рдШрдЯрд┐рдд рдХреЛрдб
 __int64 __fastcall main(__int64 a1, char **a2, char **a3) { void *v3; // rbp@1 int v4; // ebx@1 signed __int64 v5; // r8@2 char v6; // r9@3 __int64 v7; // r8@3 char v8; // cl@3 __int64 v9; // r9@5 int a2a; // [sp+Ch] [bp-1Ch]@3 v3 = &encrypted_flag; v4 = 0; setbuf(stdout, 0LL); printf("The flag is: ", 0LL); while ( 1 ) { LODWORD(v5) = 0; do { a2a = 0; fibonacci(v4 + v5, &a2a); v8 = v7; v5 = v7 + 1; } while ( v5 != 8 ); v4 += 8; if ( (unsigned __int8)(a2a << v8) == v6 ) break; v3 = (char *)v3 + 1; _IO_putc((char)(v6 ^ ((_BYTE)a2a << v8)), stdout); v9 = *((char *)v3 - 1); } _IO_putc(10, stdout); return 0LL; } 

 unsigned int __fastcall fibonacci(int i, _DWORD *a2) { _DWORD *v2; // rbp@1 unsigned int v3; // er12@3 unsigned int result; // eax@3 unsigned int v5; // edx@3 unsigned int v6; // esi@3 unsigned int v7; // edx@4 v2 = a2; if ( i ) { if ( i == 1 ) { result = fibonacci(0, a2); v5 = result - ((result >> 1) & 0x55555555); v6 = ((result - ((result >> 1) & 0x55555555)) >> 2) & 0x33333333; } else { v3 = fibonacci(i - 2, a2); result = v3 + fibonacci(i - 1, a2); v5 = result - ((result >> 1) & 0x55555555); v6 = ((result - ((result >> 1) & 0x55555555)) >> 2) & 0x33333333; } v7 = v6 + (v5 & 0x33333333) + ((v6 + (v5 & 0x33333333)) >> 4); *v2 ^= ((BYTE1(v7) & 0xF) + (v7 & 0xF) + (unsigned __int8)((((v7 >> 8) & 0xF0F0F) + (v7 & 0xF0F0F0F)) >> 16)) & 1; } else { *a2 ^= 1u; result = 1; } return result; } 

рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдФрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рд╣реИрдВ:


рдореБрдЦреНрдп
 .text:0x4004E0 main proc near ; DATA XREF: start+1Do .text:0x4004E0 .text:0x4004E0 var_1C = dword ptr -1Ch .text:0x4004E0 .text:0x4004E0 push rbp .text:0x4004E1 push rbx .text:0x4004E2 xor esi, esi ; buf .text:0x4004E4 mov ebp, offset unk_4007E1 .text:0x4004E9 xor ebx, ebx .text:0x4004EB sub rsp, 18h .text:0x4004EF mov rdi, cs:stdout ; stream .text:0x4004F6 call _setbuf .text:0x4004FB mov edi, offset format ; "The flag is: " .text:0x400500 xor eax, eax .text:0x400502 call _printf .text:0x400507 mov r9d, 49h .text:0x40050D nop dword ptr [rax] .text:0x400510 .text:0x400510 loc_400510: ; CODE XREF: main+8Aj .text:0x400510 xor r8d, r8d .text:0x400513 jmp short loc_40051B .text:0x400513 ; --------------------------------------------------------------------------- .text:0x400515 align 8 .text:0x400518 .text:0x400518 loc_400518: ; CODE XREF: main+67j .text:0x400518 mov r9d, edi .text:0x40051B .text:0x40051B loc_40051B: ; CODE XREF: main+33j .text:0x40051B lea edi, [rbx+r8] .text:0x40051F lea rsi, [rsp+28h+var_1C] .text:0x400524 mov [rsp+28h+var_1C], 0 .text:0x40052C call fibonacci .text:0x400531 mov edi, [rsp+28h+var_1C] .text:0x400535 mov ecx, r8d .text:0x400538 add r8, 1 .text:0x40053C shl edi, cl .text:0x40053E mov eax, edi .text:0x400540 xor edi, r9d .text:0x400543 cmp r8, 8 .text:0x400547 jnz short loc_400518 .text:0x400549 add ebx, 8 .text:0x40054C cmp al, r9b .text:0x40054F mov rsi, cs:stdout ; fp .text:0x400556 jz short loc_400570 .text:0x400558 movsx edi, dil ; c .text:0x40055C add rbp, 1 .text:0x400560 call __IO_putc .text:0x400565 movzx r9d, byte ptr [rbp-1] .text:0x40056A jmp short loc_400510 .text:0x40056A ; --------------------------------------------------------------------------- .text:0x40056C align 10h .text:0x400570 .text:0x400570 loc_400570: ; CODE XREF: main+76j .text:0x400570 mov edi, 0Ah ; c .text:0x400575 call __IO_putc .text:0x40057A add rsp, 18h .text:0x40057E xor eax, eax .text:0x400580 pop rbx .text:0x400581 pop rbp .text:0x400582 retn .text:0x400582 main endp 

рдлрд┐рдмреЛрдиреИрдХреА
 .text:0x400670 fibonacci proc near ; CODE XREF: main+4Cp .text:0x400670 ; fibonacci+19p ... .text:0x400670 test edi, edi .text:0x400672 push r12 .text:0x400674 push rbp .text:0x400675 mov rbp, rsi .text:0x400678 push rbx .text:0x400679 jz short loc_4006F8 .text:0x40067B cmp edi, 1 .text:0x40067E mov ebx, edi .text:0x400680 jz loc_400710 .text:0x400686 lea edi, [rdi-2] .text:0x400689 call fibonacci .text:0x40068E lea edi, [rbx-1] .text:0x400691 mov r12d, eax .text:0x400694 mov rsi, rbp .text:0x400697 call fibonacci .text:0x40069C add eax, r12d .text:0x40069F mov edx, eax .text:0x4006A1 mov ebx, eax .text:0x4006A3 shr edx, 1 .text:0x4006A5 and edx, 55555555h .text:0x4006AB sub ebx, edx .text:0x4006AD mov ecx, ebx .text:0x4006AF mov edx, ebx .text:0x4006B1 shr ecx, 2 .text:0x4006B4 and ecx, 33333333h .text:0x4006BA mov esi, ecx .text:0x4006BC .text:0x4006BC loc_4006BC: ; CODE XREF: fibonacci+C2j .text:0x4006BC and edx, 33333333h .text:0x4006C2 lea ecx, [rsi+rdx] .text:0x4006C5 mov edx, ecx .text:0x4006C7 shr edx, 4 .text:0x4006CA add edx, ecx .text:0x4006CC mov esi, edx .text:0x4006CE and edx, 0F0F0F0Fh .text:0x4006D4 shr esi, 8 .text:0x4006D7 and esi, 0F0F0Fh .text:0x4006DD lea ecx, [rsi+rdx] .text:0x4006E0 mov edx, ecx .text:0x4006E2 shr edx, 10h .text:0x4006E5 add edx, ecx .text:0x4006E7 and edx, 1 .text:0x4006EA xor [rbp+0], edx .text:0x4006ED pop rbx .text:0x4006EE pop rbp .text:0x4006EF pop r12 .text:0x4006F1 retn .text:0x4006F1 ; --------------------------------------------------------------------------- .text:0x4006F2 align 8 .text:0x4006F8 .text:0x4006F8 loc_4006F8: ; CODE XREF: fibonacci+9j .text:0x4006F8 mov edx, 1 .text:0x4006FD xor [rbp+0], edx .text:0x400700 mov eax, 1 .text:0x400705 pop rbx .text:0x400706 pop rbp .text:0x400707 pop r12 .text:0x400709 retn .text:0x400709 ; --------------------------------------------------------------------------- .text:0x40070A align 10h .text:0x400710 .text:0x400710 loc_400710: ; CODE XREF: fibonacci+10j .text:0x400710 xor edi, edi .text:0x400712 call fibonacci .text:0x400717 mov edx, eax .text:0x400719 mov edi, eax .text:0x40071B shr edx, 1 .text:0x40071D and edx, 55555555h .text:0x400723 sub edi, edx .text:0x400725 mov esi, edi .text:0x400727 mov edx, edi .text:0x400729 shr esi, 2 .text:0x40072C and esi, 33333333h .text:0x400732 jmp short loc_4006BC .text:0x400732 fibonacci endp 

рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрд╡рд╕рд░ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рдЕрдиреБрдХреВрд▓рди рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдореБрд╢реНрдХрд┐рд▓ рдХрд╛рдо рд╣реИ, рдЬрд┐рд╕рдХреЗ рджреМрд░рд╛рди рд╣рдо рдЧрд▓рддрд┐рдпрд╛рдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдареАрдХ рд╣реИ, рддреЛ рддреНрд░реБрдЯрд┐ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЖрдо рддреМрд░ рдкрд░ рдмреЗрдХрд╛рд░ рд╣реИред рд▓реЗрдХрд┐рди, рдпрджрд┐ рд╣рдо рдпреВрдирд┐рдХреЙрд░реНрди рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХреЛрдб рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рдЪрд░рдг рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рд╣рдо рдЗрди рдкрд░реЗрд╢рд╛рдирд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдлреНрд░рд┐рдбрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЬреАрдбреАрдмреА рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред


рдЕрдиреБрдХреВрд▓рди рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдпреВрдирд┐рдХреЙрд░реНрди рдЗрдВрдЬрди рдореЗрдВ рдЕрдиреБрдХрд░рдг рдЪрд▓рд╛рдПрдВрдЧреЗред рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╕рдлрд▓ рд▓реЙрдиреНрдЪ рдХреЗ рдмрд╛рдж, рдЪрд▓реЛ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред


рдЪрд░рдг 1: рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдЖрдиреЗ рджреЛ


рдЖрдЗрдП рд░рд┐рдЯреНрд░реЗрд╕рдлреНрд░реА рдлрд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдЗрдирд░реА рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд╕реЗрд╡ рдХрд░рддреЗ рд╣реИрдВред


рдЖрдЗрдП рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВ:


 from unicorn import * from unicorn.x86_const import * import struct 

рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореБрдЦреНрдп рдмрд╛рдЗрдирд░реА рдФрд░ рдмреЗрд╕рд┐рдХ рдпреВрдирд┐рдХреЙрд░реНрди рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рд▓реЛрдб рдХрд░рддреА рд╣реИред рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рджреЛ x86 рдФрд░ x86_64 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рд▓реЛрдб рдХрд░рддреА рд╣реИред


рдЕрдЧрд▓рд╛, рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдЬреЛрдбрд╝реЗрдВ:


 def read(name): with open(name) as f: return f.read() def u32(data): return struct.unpack("I", data)[0] def p32(num): return struct.pack("I", num) 

рдпрд╣рд╛рдВ рд╣рдордиреЗ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рд╣реИ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:


  • рдкрдврд╝реЗрдВ рдмрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рджреЗрддрд╛ рд╣реИ,
  • u32 рд▓реЗ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рдПрдХ 4-рдмрд╛рдЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрдВрдЯ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рддрд╛ рд╣реИ,
  • p32 рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд▓реЗ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рдЗрд╕реЗ 4-рдмрд╛рдЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред

рдиреЛрдЯ: рдпрджрд┐ рдЖрдкрдиреЗ pwntools рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рд╣реИрдВ , рддреЛ рдЖрдкрдХреЛ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 from pwn import * 

рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЖрдЦрд┐рд░рдХрд╛рд░, x86_64 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдпреВрдирд┐рдХреЙрд░реНрди рдЗрдВрдЬрди рдХреНрд▓рд╛рд╕ рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ:


 mu = Uc (UC_ARCH_X86, UC_MODE_64) 

рдпрд╣рд╛рдВ рд╣рдо Uc рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╣рддреЗ рд╣реИрдВ:


  • рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдореБрдЦреНрдп рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╣реИред рд▓рдЧрд╛рддрд╛рд░ UC_ARCH_ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ;
  • рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рд╣реИред Constants UC_MODE_ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ ред

рдЖрдк рд╕рднреА рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдзреЛрдЦрд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ ред


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ, рдпреВрдирд┐рдХреЙрд░реНрди рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЛрдб рдФрд░ рд╕реНрдЯреИрдХ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдмрд╛рдЗрдирд░реА рдХрд╛ рдЖрдзрд╛рд░ рдкрддрд╛ (рдмреЗрд╕ рдПрдбреНрд░) 0x400000 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЖрдЗрдП рд╣рдорд╛рд░реЗ рд╕реНрдЯреИрдХ рдХреЛ 0x0 рдкрд░ рд░рдЦреЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП 1024 * 1024 рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд╣рдореЗрдВ рдЗрддрдиреА рдЬрдЧрд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдЪреЛрдЯ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рддрд╛ рд╣реИред


рд╣рдо mem_map рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдореЗрдореЛрд░реА рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ:


 BASE = 0x400000 STACK_ADDR = 0x0 STACK_SIZE = 1024*1024 mu.mem_map(BASE, 1024*1024) mu.mem_map(STACK_ADDR, STACK_SIZE) 

рдЕрдм рд╣рдореЗрдВ рдмрд╛рдЗрдирд░реА рдХреЛ рдЕрдкрдиреЗ рдореБрдЦреНрдп рдкрддреЗ рдореЗрдВ рдЙрд╕реА рддрд░рд╣ рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдмреВрдЯрд▓реЛрдбрд░ рдХрд░рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рд╕реНрдЯреИрдХ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЖрд░рдПрд╕рдкреА рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


 mu.mem_write(BASE, read("./fibonacci")) mu.reg_write(UC_X86_REG_RSP, STACK_ADDR + STACK_SIZE - 1) 

рдЕрдм рд╣рдо рдЗрдореНрдпреВрд▓реЗрд╢рди рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдПрдореБрд▓реЗрдЯрд░ рдХрдм рдмрдВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдореБрдЦреНрдп () рд╕реЗ рдкрд╣рд▓реЗ рдХрдорд╛рдВрдб рдХрд╛ рдкрддрд╛ рд▓реЗрдВ, рд╣рдо 0x004004e0 рд╕реЗ рдЕрдиреБрдХрд░рдг рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрдкреВрд░реНрдг рдзреНрд╡рдЬ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЕрдВрдд рдХреЛ putc ("\ n") рдкрд░ рдХреЙрд▓ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ 0x00400575 рдкрд░ рд╕реНрдерд┐рдд рд╣реИред


 .text:0x400570 mov edi, 0Ah ; c .text:0x400575 call __IO_putc 

рд╣рдо рдЕрдиреБрдХрд░рдг рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 mu.emu_start(0x004004e0,0x00400575) 

рдЕрдм рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдПрдБ:


 a@x:~/Desktop/unicorn_engine_lessons$ python solve.py Traceback (most recent call last): File "solve.py", line 32, in <module> mu.emu_start(0x00000000004004E0, 0x0000000000400575) File "/usr/local/lib/python2.7/dist-packages/unicorn/unicorn.py", line 288, in emu_start raise UcError(status) unicorn.unicorn.UcError: Invalid memory read (UC_ERR_READ_UNMAPPED) 

рдЙрдлрд╝, рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛ рдЧрдИ, рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣ рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХреНрдпрд╛ред Mu.emu_start рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ , рд╣рдо рдЗрд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:


 def hook_code(mu, address, size, user_data): print('>>> Tracing instruction at 0x%x, instruction size = 0x%x' %(address, size)) mu.hook_add(UC_HOOK_CODE, hook_code) 

рдпрд╣ рдХреЛрдб рдПрдХ рд╣реБрдХ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╣реБрдХ_рдХреЛрдб рдлрд╝рдВрдХреНрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рд╕реЗ рдкрд╣рд▓реЗ рдПрдореБрд▓реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ:


  • Uc рдХреА рд╣рдорд╛рд░реА рдкреНрд░рддрд┐,
  • рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкрддрд╛
  • рдЖрдХрд╛рд░ рдирд┐рд░реНрджреЗрд╢
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ (рд╣рдо рдЗрд╕ рдорд╛рди рдХреЛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реНрдХ рдХреЗ рд╕рд╛рде hook_add () ) рдореЗрдВ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред
    рдЕрдм, рдпрджрд┐ рд╣рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрди рдЖрдЙрдЯрдкреБрдЯ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
     a@x:~/Desktop/unicorn_engine_lessons$ python solve.py >>> Tracing instruction at 0x4004e0, instruction size = 0x1 >>> Tracing instruction at 0x4004e1, instruction size = 0x1 >>> Tracing instruction at 0x4004e2, instruction size = 0x2 >>> Tracing instruction at 0x4004e4, instruction size = 0x5 >>> Tracing instruction at 0x4004e9, instruction size = 0x2 >>> Tracing instruction at 0x4004eb, instruction size = 0x4 >>> Tracing instruction at 0x4004ef, instruction size = 0x7 Traceback (most recent call last): File "solve.py", line 41, in <module> mu.emu_start(0x00000000004004E0, 0x0000000000400575) File "/usr/local/lib/python2.7/dist-packages/unicorn/unicorn.py", line 288, in emu_start raise UcError(status) unicorn.unicorn.UcError: Invalid memory read (UC_ERR_READ_UNMAPPED) 

    рдкрддреЗ рдкрд░ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рд╣реБрдИ, рд╣рдо рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕ рдЖрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИ:

     .text:0x4004EF mov rdi, cs:stdout ; stream 

    рдпрд╣ рдирд┐рд░реНрджреЗрд╢ 0x601038 рдкрддреЗ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ (рдЖрдк рдЗрд╕реЗ рдЖрдИрдбреАрдП рдкреНрд░реЛ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ)ред рдпрд╣ .bss рдЦрдВрдб рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдмрд╕ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЙрдЬрд┐рдХ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
    рдиреАрдЪреЗ рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛рддреНрдордХ рдирд┐рд░реНрджреЗрд╢ рд╣реИ:

     .text:0x4004F6 call _setbuf 

    рд╣рдо glibc рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ glibc рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдирд╣реАрдВ рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдЗрд╕ рдЖрджреЗрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЫреЛрдбрд╝ рднреА рд╕рдХрддреЗ рд╣реИрдВред
    рдпрд╣рд╛рдБ рд╕реНрдХрд┐рдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХреА рдкреВрд░реА рд╕реВрдЪреА рд╣реИ:

     .text:0x4004EF mov rdi, cs:stdout ; stream .text:0x4004F6 call _setbuf .text:0x400502 call _printf .text:0x40054F mov rsi, cs:stdout ; fp 

    рдЖрджреЗрд╢реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде RIP рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:

     mu.reg_write(UC_X86_REG_RIP, address+size) 

    рдЕрдм рд╣реБрдХ_рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:



     instructions_skip_list = [0x004004ef,0x004004f6,0x00400502,0x0040054f] def hook_code(mu, address, size, user_data): print('>>> Tracing instruction at 0x%x, instruction size = 0x%x' %(address, size)) if address in instructions_skip_list: mu.reg_write(UC_X86_REG_RIP, address+size) 

    рд╣рдореЗрдВ рдЙрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рднреА рдХреБрдЫ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдмрд╛рдЗрдЯ-рдмрд╛рдЗрдЯ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдзреНрд╡рдЬ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред


     .text:0x400558 movsx edi, dil ; c .text:0x40055C add rbp, 1 .text:0x400560 call __IO_putc 

    рдкреНрд░рдердо рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ __IO_putc рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрддрд╛ рд╣реИ (рдпрд╣ RDI рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИ)ред


    рд╣рдо рдбреЗрдЯрд╛ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рд╕реАрдзреЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдВрд╕реЛрд▓ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдбреЗрдЯрд╛ рдФрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЗрд╕ рд╕реЗрдЯ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реБрдХ_рдХреЛрдб рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


     instructions_skip_list = [0x004004ef,0x004004f6,0x00400502,0x0040054f] def hook_code(mu, address, size, user_data): #print('>>> Tracing instruction at 0x%x, instruction size = 0x%x' %(address, size)) if address in instructions_skip_list: mu.reg_write(UC_X86_REG_RIP, address+size) elif address == 0x400560: # c = mu.reg_read(UC_X86_REG_RDI) print(chr(c),end="") mu.reg_write(UC_X86_REG_RIP, address+size) 

    рд╣рдо рджреМрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╕рдм рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдзреАрд░реЗ-рдзреАрд░реЗред


    рдЪрд░рдг 2: рдЧрддрд┐ рдмрдврд╝рд╛рдПрдВ!


    рдЖрдЗрдП рдХрд╛рдо рдХреА рдЧрддрд┐ рдмрдврд╝рд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЗрддрдирд╛ рдзреАрдорд╛ рдХреНрдпреЛрдВ рд╣реИ?


    рдпрджрд┐ рд╣рдо рд╡рд┐рдШрдЯрд┐рдд рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдореБрдЦреНрдп () рдХреЙрд▓ рд░рд┐рдЯреНрд░реЗрд╕ () рдХрдИ рдмрд╛рд░ рдФрд░ рд░рд┐рдЯреНрд░реЗрд╕ () рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдЖрдЗрдП рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рдпрд╣ рджреЛ рддрд░реНрдХреЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рд░рд┐рдЯрд░реНрди рдорд╛рди RAX рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рджреВрд╕рд░реЗ рдХреЛ рдЙрд╕ рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджреВрд╕рд░реЗ рддрд░реНрдХ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рд╣рдо рдореБрдЦреНрдп () рдФрд░ рдлрд╝реЛрдЯреЛрдЧреНрд░рд╛рдлрд╝реА () рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзреЛрдВ рдкрд░ рдЕрдзрд┐рдХ рдЧрд╣рд░рд╛рдИ рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рджреВрд╕рд░рд╛ рддрд░реНрдХ рдХреЗрд╡рд▓ рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рди рд▓реЗрддрд╛ рд╣реИ: 0 рдпрд╛ 1. рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЗрд╕реЗ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ gdb рдЪрд▓рд╛рдПрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рд╡рд┐рд░рд╛рдо рдмрд┐рдВрджреБ рдбрд╛рд▓реЗрдВ рд░рд┐рдЯреНрд░реЗрд╕рдореЗрдВрдЯ () ред


    рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЖрдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдкрдиреЗ рд▓рд┐рдП рд╕реЛрдЪреЗрдВ, рджреВрд╕рд░рд╛ рддрд░реНрдХ рдХреЗрд╡рд▓ рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд╣рдо рдпрд╛рдж рд░рдЦреЗрдВ $ рдЗрдирд▓рд╛рдЗрди $ 2 * MAX \ _OF \ _FIRST \ _ARGUMENT $ рдЗрдирд▓рд╛рдЗрди $ рдЬреЛрдбрд╝реЗред


    рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ

    рд░рд┐рдЯреНрд░реЗрд╕ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдкрд┐рдЫрд▓реЗ рджреЛ рдХреЗ рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЧрд▓реЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред рд╣рд░ рдХрджрдо рдкрд░ рд╡рд╣ рдЧрд╣рд░реА рд╣реЛрддреА рдЬрд╛рддреА рд╣реИред рд╣рд░ рдмрд╛рд░ рдЬрдм рд╡рд╣ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдирдпрд╛ рдЕрд░реНрдеред


    рдПрдХ рдЙрджрд╛рд╣рд░рдг:
    рдЧрд╣рд░рд╛рдИ рдорд╛рди рд▓реЗрдВ = 6, рдлрд┐рд░: 1 1 2 3 5 8 ред
    рдФрд░ рдЕрдм рдЧрд╣рд░рд╛рдИ = 8, рдлрд┐рд░: 1 1 2 3 5 8 13 21ред


    рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рдпрд╛рдж рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрд╣рд▓реЗ 6 рд╕рджрд╕реНрдп 1 1 2 3 5 8 рд╣реИрдВ , рдФрд░ рдЬрдм рд╡реЗ рд╣рдореЗрдВ рдпрд╛рдж рдХрд┐рдП рдЧрдП рд╕реЗ рдЕрдзрд┐рдХ рдЧрд┐рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╡рд╣реА рд▓реЗрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рд╡рд╣реА рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЧрд╛рдпрдм рд╣реИред


    рдПрдХ рдмрд╛рд░ рдЖрд░рдЖрдИрдкреА рд░рд┐рдЯреНрд░реЗрд╕рдореЗрдВрдЯ () рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реИ, рддреЛ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдЖрд░реНрдЧреБрдореЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ рддреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ рд╕рд╛рде рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреИрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЬрдм рд╣рдо рд░рд┐рдЯреНрд░реЗрд╕рдореЗрдВрдЯ () рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ , рддреЛ рд╣рдореЗрдВ рд╕реНрдЯреИрдХ рдкрд░ рддрд░реНрдХ рд░рдЦрдиреЗ рдФрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЧрд┐рдиреЗ рд╣реБрдП рдЬреЛрдбрд╝реЗ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


    рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреИрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВ?


    • рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдо рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЬреЛрдбрд╝реА рдЙрди рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд╣реИ рдЬреЛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ:
      • рдЕрдЧрд░ рд╡рд╣рд╛рдБ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рдЬреЛрдбрд╝реА рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдХреЗрд╡рд▓ RAX рдореЗрдВ рдФрд░ рд▓рд┐рдВрдХ рдХреЗ рдкрддреЗ рдкрд░ рд░рд┐рдЯрд░реНрди рдорд╛рди рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рджреВрд╕рд░реЗ рддрд░реНрдХ рдореЗрдВ рд╣реИред рд╣рдо рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ RIP рдкрддрд╛ рднреА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд░рд┐рдЯреЗрдЯ рдХреЛ рд░рд┐рдЯреНрд░реЗрд╕рдореЗрдВрдЯ () рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рдХреЙрд▓ рд╣реБрдХ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдореБрдЦреНрдп рд╕реЗ рдХреБрдЫ рдЖрд░рдИрдЯреА рд▓реЗрдВрдЧреЗ () ;
      • рдпрджрд┐ рдпреЗ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рд╕реНрдЯреИрдХ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
    • рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд▓реМрдЯреЗ рд╣реБрдП рдЬреЛрдбрд╝реЗ рдХреЛ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЗрдирдкреБрдЯ рддрд░реНрдХреЛрдВ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рд╕реНрдЯреИрдХ рд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

    рдпрд╣ рдХреЛрдб рдпрд╣рд╛рдБ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
     FIBONACCI_ENTRY = 0x00400670 FIBONACCI_END = [ 0x004006f1, 0x00400709] instructions_skip_list = [0x004004ef,0x004004f6,0x00400502,0x0040054f] #     stack = [] # ,       d = {} def hook_code(mu, address, size, user_data): if address in instructions_skip_list: mu.reg_write(UC_X86_REG_RIP, address+size) #      elif address == 0x400560: c = mu.reg_read(UC_X86_REG_RDI) print(chr(c),end="") mu.reg_write(UC_X86_REG_RIP, address+size) #     ? elif address == FIBONACCI_ENTRY: #     RDI arg0 = mu.reg_read(UC_X86_REG_RDI) #    () r_rsi = mu.reg_read(UC_X86_REG_RSI) #   ,    arg1 = u32(mu.mem_read(r_rsi, 4)) # ,    ? if (arg0,arg1) in d: (ret_rax, ret_ref) = d[(arg0,arg1)] #     RAX mu.reg_write(UC_X86_REG_RAX, ret_rax) #     mu.mem_write(r_rsi, p32(ret_ref)) #  RIP  RET ,       fibonacci mu.reg_write(UC_X86_REG_RIP, 0x400582) else: #      ,      stack.append((arg0,arg1,r_rsi)) elif address in FIBONACCI_END: #     (arg0, arg1, r_rsi) = stack.pop() #     RAX ret_rax = mu.reg_read(UC_X86_REG_RAX) #  ,      ret_ref = u32(mu.mem_read(r_rsi,4)) #      d[(arg0, arg1)]=(ret_rax, ret_ref) 

    рдпрд╣рд╛рдБ рдкреВрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ
     #!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function from unicorn import * from unicorn.x86_const import * import struct def read(name): with open(name) as f: return f.read() def u32(data): return struct.unpack("I", data)[0] def p32(num): return struct.pack("I", num) FIBONACCI_ENTRY = 0x00400670 FIBONACCI_END = [ 0x004006f1, 0x00400709] instructions_skip_list = [0x004004ef,0x004004f6,0x00400502,0x0040054f] #     stack = [] # ,       d = {} def hook_code(mu, address, size, user_data): if address in instructions_skip_list: mu.reg_write(UC_X86_REG_RIP, address+size) #      elif address == 0x400560: c = mu.reg_read(UC_X86_REG_RDI) print(chr(c),end="") mu.reg_write(UC_X86_REG_RIP, address+size) #     ? elif address == FIBONACCI_ENTRY: #     RDI arg0 = mu.reg_read(UC_X86_REG_RDI) #    () r_rsi = mu.reg_read(UC_X86_REG_RSI) #   ,    arg1 = u32(mu.mem_read(r_rsi, 4)) # ,    ? if (arg0,arg1) in d: (ret_rax, ret_ref) = d[(arg0,arg1)] #     RAX mu.reg_write(UC_X86_REG_RAX, ret_rax) #     mu.mem_write(r_rsi, p32(ret_ref)) #  RIP  RET .     fibonacci mu.reg_write(UC_X86_REG_RIP, 0x400582) else: #      ,      stack.append((arg0,arg1,r_rsi)) elif address in FIBONACCI_END: #     (arg0, arg1, r_rsi) = stack.pop() #     RAX ret_rax = mu.reg_read(UC_X86_REG_RAX) #  ,      ret_ref = u32(mu.mem_read(r_rsi,4)) #      d[(arg0, arg1)]=(ret_rax, ret_ref) mu = Uc (UC_ARCH_X86, UC_MODE_64) BASE = 0x400000 STACK_ADDR = 0x0 STACK_SIZE = 1024*1024 mu.mem_map(BASE, 1024*1024) mu.mem_map(STACK_ADDR, STACK_SIZE) mu.mem_write(BASE, read("./fibonacci")) mu.reg_write(UC_X86_REG_RSP, STACK_ADDR + STACK_SIZE - 1) mu.hook_add(UC_HOOK_CODE, hook_code) mu.emu_start(0x004004e0, 0x00400575) print() 

    рд╣реБрд░реНрд░реЗ, рд╣рдо рдЕрдВрддрддрдГ рдпреВрдирд┐рдХреЙрд░реНрди рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗред рдЕрдЪреНрдЫрд╛ рдХрд╛рдо!


    рдПрдХ рдиреЛрдЯ


    рдЕрдм рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдереЛрдбрд╝рд╛ рд╣реЛрдорд╡рд░реНрдХ рджреЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
    рдпрд╣рд╛рдВ рдЖрдк рддреАрди рдФрд░ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдПрдХ рд╕рдВрдХреЗрдд рдФрд░ рдПрдХ рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рд╣реИред рдЖрдк рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реБрдП рдЪреАрдЯрд╢реАрдЯ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред


    рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд┐рд░ рдХрд╛ рдирд╛рдо рдпрд╛рдж рд░рдЦрдирд╛ рд╣реИред рдпрджрд┐ рдЖрдк IPython рдореЗрдВ рдЯреИрдм рдРрдб-рдСрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ IPython рд╕реНрдерд╛рдкрд┐рдд рд╣реЛ, рддреЛ рдЖрдк рдЧреЗрдВрдбрд╛ рдЖрдпрд╛рдд UC_ARCH_ рдкреНрд░реЗрд╕ рдЯреИрдм рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рд╕рднреА рд╕реНрдерд┐рд░рд╛рдВрдХ рджрд┐рдЦрд╛рдП рдЬрд╛рдПрдВрдЧреЗ рдЬреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi431058/


All Articles