Как скомпилировать дизассемблированный код?

Читаю книжку по дизассемблированию (Исскуство Дизассемблирования), там разбирается пример взлома простой программы. OS: linux fedora

Вот код ее код:

#include <iostream>
#include <cstring>

int main() {
    const char* legal_psw = "my.good.password";
    char user_psw[666];

    std::cout << "crackme 00h\nenter passwd: ";
    std::cin >> user_psw;

    if (strcmp(legal_psw, user_psw) != 0) {
        std::cout << "wrong password\n";
    } else {
        std::cout << "password ok\nhello, legal user!\n";
    }

    return 0;
}

Я скомпилировал ее с помощью g++, затем выполнил дизассемблирование фреймворком radare2 с флагом -pd и получил данный результат:

[0x00401060]> pd
            ;-- section..text:
            ;-- _start:
            ;-- rip:
┌ 37: entry0 (int64_t arg3);
│           ; arg int64_t arg3 @ rdx
│           0x00401060      f30f1efa       endbr64                     ; [14] -r-x section size 408 named .text
│           0x00401064      31ed           xor ebp, ebp
│           0x00401066      4989d1         mov r9, rdx                 ; arg3
│           0x00401069      5e             pop rsi
│           0x0040106a      4889e2         mov rdx, rsp
│           0x0040106d      4883e4f0       and rsp, 0xfffffffffffffff0
│           0x00401071      50             push rax
│           0x00401072      54             push rsp
│           0x00401073      4531c0         xor r8d, r8d
│           0x00401076      31c9           xor ecx, ecx
│           0x00401078      48c7c7461140.  mov rdi, dbg.main           ; 0x401146
└           0x0040107f      ff15532f0000   call qword [reloc.__libc_start_main] ; [0x403fd8:8]=0
            0x00401085      f4             hlt
            0x00401086      662e0f1f8400.  nop word cs:[rax + rax]
┌ 5: sym._dl_relocate_static_pie ();
│           0x00401090      f30f1efa       endbr64
└           0x00401094      c3             ret
            0x00401095      662e0f1f8400.  nop word cs:[rax + rax]
            0x0040109f      90             nop
            ; CALL XREF from sym.__do_global_dtors_aux @ 0x401121(x)
┌ 31: sym.deregister_tm_clones ();
│           0x004010a0      b820404000     mov eax, obj.__TMC_END__    ; 0x404020
│           0x004010a5      483d20404000   cmp rax, obj.__TMC_END__    ; 0x404020
│       ┌─< 0x004010ab      7413           je 0x4010c0
│       │   0x004010ad      b800000000     mov eax, 0
│       │   0x004010b2      4885c0         test rax, rax
│      ┌──< 0x004010b5      7409           je 0x4010c0
│      ││   0x004010b7      bf20404000     mov edi, obj.__TMC_END__    ; 0x404020
│      ││   0x004010bc      ffe0           jmp rax
       ││   0x004010be      6690           nop
│      ││   ; CODE XREFS from sym.deregister_tm_clones @ 0x4010ab(x), 0x4010b5(x)
└      └└─> 0x004010c0      c3             ret
            0x004010c1      66662e0f1f84.  nop word cs:[rax + rax]
            0x004010cc      0f1f4000       nop dword [rax]
            ; CODE XREF from sym.frame_dummy @ 0x401144(x)
┌ 49: sym.register_tm_clones ();
│       ┌─> 0x004010d0      be20404000     mov esi, obj.__TMC_END__    ; 0x404020
│       ╎   0x004010d5      4881ee204040.  sub rsi, obj.__TMC_END__    ; 0x404020
│       ╎   0x004010dc      4889f0         mov rax, rsi
│       ╎   0x004010df      48c1ee3f       shr rsi, 0x3f
│       ╎   0x004010e3      48c1f803       sar rax, 3
│       ╎   0x004010e7      4801c6         add rsi, rax
│       ╎   0x004010ea      48d1fe         sar rsi, 1
│      ┌──< 0x004010ed      7411           je 0x401100
│      │╎   0x004010ef      b800000000     mov eax, 0
│      │╎   0x004010f4      4885c0         test rax, rax
│     ┌───< 0x004010f7      7407           je 0x401100
│     ││╎   0x004010f9      bf20404000     mov edi, obj.__TMC_END__    ; 0x404020
│     ││╎   0x004010fe      ffe0           jmp rax
│     ││╎   ; CODE XREFS from sym.register_tm_clones @ 0x4010ed(x), 0x4010f7(x)
└     └└──> 0x00401100      c3             ret
        ╎   0x00401101      66662e0f1f84.  nop word cs:[rax + rax]
        ╎   0x0040110c      0f1f4000       nop dword [rax]
        ╎   ;-- entry.fini0:
┌ 32: sym.__do_global_dtors_aux ();
│       ╎   0x00401110      f30f1efa       endbr64
│       ╎   0x00401114      803d5d310000.  cmp byte [obj.completed.0], 0 ; [0x404278:1]=0
│      ┌──< 0x0040111b      7513           jne 0x401130
│      │╎   0x0040111d      55             push rbp
│      │╎   0x0040111e      4889e5         mov rbp, rsp
│      │╎   0x00401121      e87affffff     call sym.deregister_tm_clones
│      │╎   0x00401126      c6054b310000.  mov byte [obj.completed.0], 1 ; [0x404278:1]=0
│      │╎   0x0040112d      5d             pop rbp
│      │╎   0x0040112e      c3             ret
       │╎   0x0040112f      90             nop
│      │╎   ; CODE XREF from sym.__do_global_dtors_aux @ 0x40111b(x)
└      └──> 0x00401130      c3             ret
        ╎   0x00401131      66662e0f1f84.  nop word cs:[rax + rax]
        ╎   0x0040113c      0f1f4000       nop dword [rax]
        ╎   ;-- entry.init0:
┌ 6: sym.frame_dummy ();
│       ╎   0x00401140      f30f1efa       endbr64
└       └─< 0x00401144      eb8a           jmp sym.register_tm_clones
            ;-- main:
            ; DATA XREF from entry0 @ 0x401078(r)
┌ 119: int dbg.main (int argc, char **argv, char **envp);
│           ; var char const *legal_psw @ rbp-0x8
│           ; var char[666] user_psw @ rbp-0x2b0
│           0x00401146      55             push rbp                    ; system_error:4 // ; int main();
│           0x00401147      4889e5         mov rbp, rsp
│           0x0040114a      4881ecb00200.  sub rsp, 0x2b0

После этого я поменял инструкцию je на jmp, как мне теперь скомпилировать это опять в исполняемый файл? Надеюсь на вашу помощь, всем заранее спасибо!


Ответы (1 шт):

Автор решения: GxdTxnz

Командой wq. Открываете файл с флагом -w. Потом жестко меняете инструкции которые хотите. Как пример, wa jmp 0x0040111b. И выходите, сохранив изменения wq. Далее, просто запускаете измененную программу. Для удобства советую установить графическое окружение. Инструкцию можете найти тут

→ Ссылка