В настоящее время я пытаюсь ввести код, который будет печатать helloworld в уязвимую программу. Мне удалось ввести код, сохранив его в одной из переменных окружения и перезаписав регистр копирования, чтобы указать на этот код. Вот мои сборки и операционные коды:Injected 64-битный shellcode не выполняет syscall
0000000000000000 <_start>:
0: eb 17 jmp 19 <stack_setup>
0000000000000002 <execute>:
2: 48 31 c0 xor %rax,%rax
5: b0 01 mov $0x1,%al
7: 48 31 ff xor %rdi,%rdi
a: 48 ff c7 inc %rdi
d: 5e pop %rsi
e: b2 0f mov $0xf,%dl
10: 0f 05 syscall
12: b0 3c mov $0x3c,%al
14: 48 ff cf dec %rdi
17: 0f 05 syscall
0000000000000019 <stack_setup>:
19: e8 e4 ff ff ff callq 2 <execute>
1e: 48 rex.W
1f: 65 gs
20: 6c insb (%dx),%es:(%rdi)
21: 6c insb (%dx),%es:(%rdi)
22: 6f outsl %ds:(%rsi),(%dx)
23: 2c 20 sub $0x20,%al
25: 77 6f ja 96 <stack_setup+0x7d>
27: 72 6c jb 95 <stack_setup+0x7c>
29: 64 21 0a and %ecx,%fs:(%rdx)
2c: 0d .byte 0xd
В опкодах после линии 19 предназначены для БД команд, 0x0a, 0x0d «Привет, мир!». Изучив выполнение инструкций в строках x2-x10 с помощью gdb, я заметил, что он правильно подготовил аргументы для печати строки Hello, World. Однако при выполнении инструкции syscall ничего не происходит. То же самое следует сказать по инструкциям из строки x12 - x17.
Я также попытался скомпилировать и связать код сборки, чтобы выполнить его самостоятельно, и он работает правильно. В дополнение к этому, я составил уязвимую программу с параметрами
-fno-stack-protector -z execstack
Так что я могу запустить код, расположенный в стеке. Я также отключил randomizing_va_space. Я хочу спросить, есть ли что-то, что я не сделал, чтобы позволить мне успешно выполнить код, который я ввел?
Вы сказали, что ваша БД «Привет, мир!», 0x0a, 0x0D поставил после строки 19, так почему вы прыгаете на линии 19 в первый линии вашей программы? –
Он должен установить стек, чтобы я мог поместить адрес в регистр rsi. Использование вызова более высокого адреса может привести к появлению нулевых байтов. Итак, я jmp на более высокий адрес, определяю мир Hello, а затем вызываю нижний адрес (поскольку он находится в двух дополнениях, не будет нулевых байтов), а затем всплывает верхняя часть стека, содержащая адрес строки. – MykelXIII
Программы, особенно услуги, иногда перенаправляют/повторно открывают свой стандарт; вы уверены, что все будет так, как вы думаете? Возможно, попробуйте использовать stderr; он немного реже перенаправляется в никуда. Вы пытались запустить его в стек со своей собственной оболочкой? – user3710044