Раздел «Язык Си».NasmPlus:

Пример кода программы на NASM, которая считывает два целых числа и выводит их сумму

Для 32-битной архитектуры

Компиляция, линковка и запуск файла hh.asm

nasm -f elf hh.asm 
gcc -m32 hh.o
./a.out

Собственно код программы:

global main

;Объявляем используемые внешние функции из libc
extern exit
extern scanf
extern printf

;Сегмент кода:
section .text

;Функция main:
main:

;Параметры передаются в стеке:
push dword a
push dword msg1
call scanf
add esp, 8            ; в стек клали 2 dword (по 4 байта)

push dword b
push dword msg1
call scanf
add esp, 8            ; в стек клали 2 dword (по 4 байта)


mov eax, dword [a]      ; берем двойное слово (32 бита) по адресу а
mov ebx, dword [b]      ; берем двойное слово (32 бита) по адресу b
add eax,ebx            ; bx = ax, старшие биты забиты нулями
                  
push dword eax
push dword msg2
call printf
add esp, 8            ; в стек клали 2 dword (по 4 байта)

;Завершение программы с кодом выхода 0:
push dword 0
call exit


;Сегмент инициализированных данных
section .data
msg1 : db "%ld",0
msg2 : db "%ld", 0xA, 0

; Сегмент неинициализированных данных
section .bss
a resd 1
b resd 1      

objdump

Запускаем из командной строки для файла hello.exe

objdump -d --disassembler-options=intel hello.exe=

По желанию добавляем ключ -s.

Valgrind

valgrind имя_исполняемого_файла

gdb

gdb имя_исполняемого_файла
print имя_символа_из_d-секции - напечатать его значение
q - выйти
b main - поставить брейкпоинт на метку main
display a - показывать значение переменной =a=
run - запустить
s - step - один(!) шаг  (выясняем, что же записали в ebx в main)
i r - смотрим содержимое регистров (info)

Доступ к удаленному серверу

Контест Утиные истории (подсказки)

Контест Инструменты (подсказки)

Profiler

valgrind

gcc -Wall -g hello.c

gdb

nm имя_файла

Attachment sort Action Size Date Who Comment
qq.asm manage 11.0 K 16 Apr 2013 - 08:17 TatyanaDerbysheva victim objdump