2015-02-15 1 views
1

В настоящее время я пытаюсь ввести код, который будет печатать 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. Я хочу спросить, есть ли что-то, что я не сделал, чтобы позволить мне успешно выполнить код, который я ввел?

+0

Вы сказали, что ваша БД «Привет, мир!», 0x0a, 0x0D поставил после строки 19, так почему вы прыгаете на линии 19 в первый линии вашей программы? –

+0

Он должен установить стек, чтобы я мог поместить адрес в регистр rsi. Использование вызова более высокого адреса может привести к появлению нулевых байтов. Итак, я jmp на более высокий адрес, определяю мир Hello, а затем вызываю нижний адрес (поскольку он находится в двух дополнениях, не будет нулевых байтов), а затем всплывает верхняя часть стека, содержащая адрес строки. – MykelXIII

+0

Программы, особенно услуги, иногда перенаправляют/повторно открывают свой стандарт; вы уверены, что все будет так, как вы думаете? Возможно, попробуйте использовать stderr; он немного реже перенаправляется в никуда. Вы пытались запустить его в стек со своей собственной оболочкой? – user3710044

ответ

3

Причина может заключаться в том, что в строке write syscall возвращается код ошибки. Это может быть по многим причинам, но, может быть, 10 не все нули, поэтому вы должны xor %rdx, %rdx перед загрузкой 15 там (на самом деле вы должны загрузить только 14, для "Hello, World!\n").

Во всяком случае, ошибка из write будет возвращен в rax, и быть отрицательным числом (-errno), таким образом, когда вы делаете

mov $0x3c,%al 
dec %rdi 
syscall 

Это будет неверный системный вызов, и errno 38 для ENOSYS будет вернулся.

exit я должен работать в любом случае, делая

xor %rax, %rax 
mov $0x3c,%al 
syscall 

Я рекомендую запускать программу с strace и посмотреть с его выхода, почему именно write не удается.


Вот версия кода оболочки, которая работает для меня:

0000000000000000 <main>: 
    0: eb 1d     jmp 1f <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: 48 31 d2    xor %rdx,%rdx 
    11: b2 0e     mov $0xe,%dl 
    13: 0f 05     syscall 
    15: 48 31 c0    xor %rax,%rax 
    18: b0 3c     mov $0x3c,%al 
    1a: 48 ff cf    dec %rdi 
    1d: 0f 05     syscall 

000000000000001f <stack_setup>: 
    1f: e8 de ff ff ff   callq 2 <execute> 
    24: 48      rex.W 
    25: 65 6c     gs insb (%dx),%es:(%rdi) 
    27: 6c      insb (%dx),%es:(%rdi) 
    28: 6f      outsl %ds:(%rsi),(%dx) 
    29: 2c 20     sub $0x20,%al 
    2b: 57      push %rdi 
    2c: 6f      outsl %ds:(%rsi),(%dx) 
    2d: 72 6c     jb  9b <stack_setup+0x7c> 
    2f: 64 21 0a    and %ecx,%fs:(%rdx) 
+0

Спасибо, я попробую, когда вернусь домой (сейчас я в офисе). – MykelXIII

+0

Принимая ответ. Вы были правы, я забыл обнулить регистр rdx. Я обнулял другие регистры, я не знаю, почему я забыл о rdx. – MykelXIII