Получить аргументы из стека с помощью EBP

0

Мне нужна помощь здесь, я новичок в хорошем языке. То, что я сделал до сих пор. Код ассемблера:

extern puts
section .data
    test: db 'test',0

section .text
    global main
main:
    push ebp
    mov ebp, esp

    mov ecx, [ebp+12]
    push ecx
    call puts

    pop ecx

    mov eax,0
    leave
    ret 0x80

SO: Ubuntu 14.04.1 LTS, gcc версия 4.8.2 nasm -f elf32 2lab.asm: nasm -f elf32 2lab.asm и скомпилируйте с gcc gcc -lc -m32 2lab.o -o 2lab

objdump -dS -M intel-mnemonic 2lab объекта раздела main objdump -dS -M intel-mnemonic 2lab

080484a0 <main>:
 80484a0:       55                      push   ebp
 80484a1:       89 e5                   mov    ebp,esp
 80484a3:       8b 4d 08                mov    ecx,DWORD PTR [ebp+0xc]
 80484a6:       51                      push   ecx
 80484a7:       e8 44 fe ff ff          call   80482f0 <puts@plt>
 80484ac:       59                      pop    ecx
 80484ad:       b8 00 00 00 00          mov    eax,0x0
 80484b2:       c9                      leave  
 80484b3:       c2 80 00                ret    0x80

Запустите его ./2lab firstArg, выход - и если я заменил mov ecx, [ebp+12] с mov ecx, [ebp+8] результатом будет Segmentation fault (core dumped)

Где я ошибаюсь? Буду признателен, если вы ответите подробно. Как здесь и здесь, я не знаю, что я пропустил. Благодарю!

  • 0
    2lab.asm? Это звучит как домашнее задание.
  • 0
    @MattD По крайней мере, он попробовал и показал свою работу
Показать ещё 1 комментарий
Теги:
assembly

2 ответа

2

Помните, что прототип main - int main(int argc, char** argv). Обратите внимание, что тип argv - char**. Вы хотите puts(argv[1]) но вы эффективно делаете puts(argv). Зная, что argv[1] по определению означает *(argv + 1) и что C-указательная арифметика масштабируется по размеру элемента, вам нужно заменить push ecx на push dword [ecx + 4].

PS: ret 0x80 неверен, вы, вероятно, смешали ret и int 0x80 вместе. Вы просто хотите ret сюда.

  • 0
    Я уверен, что он должен ссылаться на тест, объявленный в своем сегменте данных, а не на аргументы командной строки.
  • 0
    @MattD Заголовок говорит, что get argument from stack , а также вызов firstArg что ему нужен этот аргумент.
Показать ещё 2 комментария
0

Строковый аргумент puts() скорее всего неверен. Проверьте его API и убедитесь, что вы загружаете правильные аргументы. Строковые функции, такие как puts(), читают их ввод, пока не достигнут нулевого терминатора. Если они не найдут один и не будут считывать память за пределы, вы будете испытывать ошибку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню