Как скомпилировать дизассемблированный код?
Читаю книжку по дизассемблированию (Исскуство Дизассемблирования), там разбирается пример взлома простой программы. 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 шт):
Командой wq
. Открываете файл с флагом -w
. Потом жестко меняете инструкции которые хотите. Как пример, wa jmp 0x0040111b
. И выходите, сохранив изменения wq
. Далее, просто запускаете измененную программу. Для удобства советую установить графическое окружение. Инструкцию можете найти тут