Здравствуйте, начал изучать NASM, для изучения пишу простенький bind cmd Столкнулся с некоторыми трудностями, не знаю верный ли код я написал, посмотрите пожалуйста и поправьте: Код (ASM): extern WSAStartup extern WSACleanup extern socket extern Sleep extern ExitProcess extern accept extern listen extern bind SECTION .bss hSocket: resq 1 SECTION .data port: equ 777 struc WSADATA .wVersion: resw 1 .wHighVersion: resw 1 .szDescription: resb 256 .szSystemStatus: resb 256 .iMaxSockets: resd 1 .iMaxUdpDg: resd 1 .lpVendorInfo: resq 1 endstruc struc sockaddr_in .sin_family: resd 1 .sin_port: resd 1 .sin_addr: resb in_addr .sin_zero: resb 8 .size: endstruc struc in_addr .s_addr: resq 1 endstruc SECTION .code global main main: mov rdx , [WSADATA] mov rcx , 0x202 call WSAStartup mov r8 , 0 mov rdx , 1 mov rcx , 2 call socket mov [hSocket] , rax mov dword [sockaddr_in.sin_family] , 1 mov qword [sockaddr_in.sin_addr] , 0 mov ax , port xchg ah , al mov [sockaddr_in.sin_port] , ax mov r8 , sockaddr_in.size mov rdx , [sockaddr_in] mov rcx , hSocket call bind mov rdx , 13 mov rcx , hSocket call listen mov r8 , 0 mov rdx , [sockaddr_in] mov rcx , hSocket call accept mov rcx , 60000 call Sleep call WSACleanup mov rcx,0 call ExitProcess Код (Text): nasm cmd.asm -f win64 -o cmd.obj gcc cmd.obj -lws2_32 -m64 -o cmd.exe Выдает следующую ошибку: Код (Text): cmd.obj:cmd.asm:(.code+0x2b): relocation truncated to fit: R_X86_64_32 against `.bss' collect2: error: ld returned 1 exit status
Скормил гуглу "relocation truncated to fit" -> http://stackoverflow.com/questions/25314357/relocation-truncated-to-fit-r-x86-64-32 The problem is that general x64 instructions do not allow direct 64-bit addresses in their encodings. И там предлагают адресовать не напрямую смещение, а загонять его напр. в RAX, и адресовать уже по регистру, т.е. как [RAX] (вместо rax - любой неиспользуемый регистр)
Огромное спасибо! Программа вываливается, где я ошибся? Код (ASM): extern WSAStartup extern WSACleanup extern socket extern Sleep extern ExitProcess extern accept extern listen extern bind SECTION .bss SECTION .data port: equ 777 struc WSADATA .wVersion: resw 1 .wHighVersion: resw 1 .szDescription: resb 256 .szSystemStatus: resb 256 .iMaxSockets: resd 1 .iMaxUdpDg: resd 1 .lpVendorInfo: resq 1 endstruc struc sockaddr_in .sin_family: resd 1 .sin_port: resd 1 .sin_addr: resb in_addr .sin_zero: resb 8 .size: endstruc struc in_addr .s_addr: resq 1 endstruc SECTION .code global main main: mov rdx , [WSADATA] mov rcx , 0x202 call WSAStartup mov r8 , 0 mov rdx , 1 mov rcx , 2 call socket mov [r13] , rax mov dword [sockaddr_in.sin_family] , 1 mov qword [sockaddr_in.sin_addr] , 0 mov ax , port xchg ah , al mov [sockaddr_in.sin_port] , ax mov r8 , sockaddr_in.size mov rdx , [sockaddr_in] mov [rcx] , r13 call bind mov rdx , 13 mov [rcx] , r13 call listen mov r8 , 0 mov rdx , [sockaddr_in] mov [rcx] , r13 call accept mov rcx , 60000 call Sleep call WSACleanup mov rcx,rax call ExitProcess
Скачал x64dbg Код (ASM): mov rdx , [WSADATA] Интерпретируется как: Код (ASM): mov rdx,qword prt ds:0 Что-то не то со структурой WSADATA ?
Что-то мне подсказывает, что у вас нет навыков прогр-я под вин64 на асм. У меня тоже их нет, но здесь возникающие вопросы говорят о серьезном недостатке навыков. Быть может, программу попроще? Быть может на x32? Я могу ошибаться, если вдруг обидел, и эти проблемы именно из-за синтаксиса NASM.
Некорректно обращаетесь к началу (смещению) этой структуры, или же я так понял, объявили структуру структуры (что Человек = существо с головой и руками-ногами), но не объявили ее представителя (Вася = Человек). http://stackoverflow.com/questions/...the-first-struct-member-list-in-nasm-assembly google "nasm structure example" Судя по картинке, там еще несколько мест, где идет обращение к нулевой ячейке, и где закономерным образом вашу программу будут закрывать с ошибкой.
Все правильно вам _edge подсказал, вы объявили структуру, но переменную не объявили. Соответственно вам компилятор выдал 0. С 64 битами это мало связано. Простое незнание компилятора. в тоже секции .data объявите переменные Наподобие: Код (ASM): SEGMENT .data myWSADATA: ISTRUC WSADATA ;здесь заполняем поля структуры IEND Либо просто делаете Код (ASM): push rbp mov rbp, rsp sub rsp, WSADATA.size ;(поле size Надо добавить в конец структуры ) Либо резервируете место в .bss Код (ASM): SEGMENT .bss myWSADATA: RESB WSADATA.size А в коде уже обращайтесь к myWSADATA либо к стеку, если выделили память на стеке.
Не палучается инициализировать структуры: Код (ASM): extern WSAStartup extern WSACleanup extern socket extern Sleep extern ExitProcess extern accept extern listen extern bind SECTION .bss stsockaddr_in: resb sockaddr_in.size SECTION .data port: equ 777 struc WSADATA .wVersion: resw 1 .wHighVersion: resw 1 .szDescription: resb 256 .szSystemStatus: resb 256 .iMaxSockets: resd 1 .iMaxUdpDg: resd 1 .lpVendorInfo: resq 1 endstruc stWSADATA: istruc WSADATA at wVersion, dw 0 at wHighVersion, dw 0 at szDescription, db 0 at szSystemStatus, db 0 at iMaxSockets, dd 0 at iMaxUdpDg, dd 0 at lpVendorInfo, dq 0 iend struc sockaddr_in .sin_family: resd 1 .sin_port: resd 1 .sin_addr: resq 1 .sin_zero: resb 8 .size: endstruc stsockaddr_in: istruc sockaddr_in at sin_famlily, dd 0 at sin_port, dd 0 at sin_addr, dq 0 at sin_zero, db 0 iend struc in_addr s_addr: resq 1 endstruc stin_addr: istruc struc in_addr at s_addr, dq 0 iend SECTION .code Код (Text): cmd.asm:32: error: non-constant argument supplied to TIMES cmd.asm:33: error: non-constant argument supplied to TIMES cmd.asm:34: error: non-constant argument supplied to TIMES cmd.asm:35: error: non-constant argument supplied to TIMES cmd.asm:36: error: non-constant argument supplied to TIMES cmd.asm:37: error: non-constant argument supplied to TIMES cmd.asm:38: error: non-constant argument supplied to TIMES cmd.asm:48: error: symbol `stsockaddr_in' redefined cmd.asm:50: error: non-constant argument supplied to TIMES cmd.asm:51: error: non-constant argument supplied to TIMES cmd.asm:52: error: non-constant argument supplied to TIMES cmd.asm:53: error: non-constant argument supplied to TIMES cmd.asm:62: error: symbol `in_addr' redefined cmd.asm:63: error: non-constant argument supplied to TIMES cmd.asm:64: error: non-constant argument supplied to TIMES
Даже так выдаёт ошибку: Код (ASM): extern WSAStartup extern WSACleanup extern socket extern Sleep extern ExitProcess extern accept extern listen extern bind SECTION .bss stsockaddr_in: resb sockaddr_in.size SECTION .data port: equ 777 struc WSADATA. .wVersion: resw 1 .wHighVersion: resw 1 .szDescription: resb 256 .szSystemStatus: resb 256 .iMaxSockets: resd 1 .iMaxUdpDg: resd 1 .lpVendorInfo: resq 1 endstruc stWSADATA: istruc WSADATA at WSADATA.wVersion, dw 0 at WSADATA.wHighVersion, dw 0 at WSADATA.szDescription, db 0 at WSADATA.szSystemStatus, db 0 at WSADATA.iMaxSockets, dd 0 at WSADATA.iMaxUdpDg, dd 0 at WSADATA.lpVendorInfo, dq 0 iend struc sockaddr_in .sin_family: resd 1 .sin_port: resd 1 .sin_addr: resq 1 .sin_zero: resb 8 .size: endstruc stsockaddr_in: istruc sockaddr_in at sockaddr_in.sin_famlily, dd 0 at sockaddr_in.sin_port, dd 0 at sockaddr_in.sin_addr, dq 0 at sockaddr_in.sin_zero, db 0 iend struc in_addr s_addr: resq 1 endstruc stin_addr: istruc struc in_addr at in_addr.s_addr, dq 0 iend Код (Text): cmd.asm:38: error: non-constant argument supplied to TIMES cmd.asm:48: error: symbol `stsockaddr_in' redefined cmd.asm:50: error: non-constant argument supplied to TIMES cmd.asm:62: error: symbol `in_addr' redefined cmd.asm:63: error: non-constant argument supplied to TIMES cmd.asm:64: error: non-constant argument supplied to TIMES
Сложно сходу понять, к сожалению. Как будто идет повторное переобъявление переменных (параметров структуры), а они уже заданы до этого. (https://forum.nasm.us/index.php?topic=395.0) Может, убрать эти структуры, и просто работать со смещением полей относительно условного начала структур? wsadata: 1st_field dw 1234h 2st_field db 99h 3rd_field dd 12345678h и обращение к третьему полю будет как [wsadata+2+1], где 2 и 1 - размеры предыдущих полей, dw и db. А вообще хочу сказать что все правильно делаете. Раз уж начинать, с 64 сразу, чтобы мозг 16-биткой не засорять. И неплохую практическую задачу, шелл.
Второй пример почти правильный - нафиг было объявлять 2 одинаковые переменные? вначале в bss объявили stsockaddr_in, а потом в data )) Вы уж определитесь )
Убрал но всеравно ошибки error: symbol `in_addr' redefined и non-constant argument supplied to TIMES Код (ASM): extern WSAStartup extern WSACleanup extern socket extern Sleep extern ExitProcess extern accept extern listen extern bind SECTION .bss SECTION .data port: equ 777 struc WSADATA. .wVersion: resw 1 .wHighVersion: resw 1 .szDescription: resb 256 .szSystemStatus: resb 256 .iMaxSockets: resd 1 .iMaxUdpDg: resd 1 .lpVendorInfo: resq 1 endstruc stWSADATA: istruc WSADATA at WSADATA.wVersion, dw 0 at WSADATA.wHighVersion, dw 0 at WSADATA.szDescription, db 0 at WSADATA.szSystemStatus, db 0 at WSADATA.iMaxSockets, dd 0 at WSADATA.iMaxUdpDg, dd 0 at WSADATA.lpVendorInfo, dq 0 iend struc sockaddr_in .sin_family: resd 1 .sin_port: resd 1 .sin_addr: resq 1 .sin_zero: resb 8 .size: endstruc stsockaddr_in: istruc sockaddr_in at sockaddr_in.sin_famlily, dd 0 at sockaddr_in.sin_port, dd 0 at sockaddr_in.sin_addr, dq 0 at sockaddr_in.sin_zero, db 0 iend struc in_addr s_addr: resq 1 endstruc stin_addr: istruc struc in_addr at in_addr.s_addr, dq 0 iend SECTION .code global main main: mov rdx , [WSADATA] mov rcx , 0x202 call WSAStartup mov r8 , 0 mov rdx , 1 mov rcx , 2 call socket mov [r13] , rax mov dword [sockaddr_in.sin_family] , 1 mov qword [sockaddr_in.sin_addr] , 0 mov ax , port xchg ah , al mov dword [sockaddr_in.sin_port] , ax mov r8 , sockaddr_in.size mov rdx , [sockaddr_in] mov [rcx] , r13 call bind mov rdx , 13 mov [rcx] , r13 call listen mov r8 , 0 mov rdx , [sockaddr_in] mov [rcx] , r13 call accept mov rcx , 60000 call Sleep call WSACleanup mov rcx , rax call ExitProcess Код (Text): cmd.asm:36: error: non-constant argument supplied to TIMES cmd.asm:48: error: non-constant argument supplied to TIMES cmd.asm:60: error: symbol `in_addr' redefined cmd.asm:61: error: non-constant argument supplied to TIMES cmd.asm:62: error: non-constant argument supplied to TIMES
В самом коде много неточностей. К примеру: Код (ASM): mov [r13] , rax На что ссылается r13? Также размеры полей структур также вызывают смущение (хотя не знаю какое там выравнивание по умолчанию). Что касается объявления то лучше все объявить в .bss, если ты в коде инициализируешь значения. Код пишу без проверки, может что-то не работать: Код (ASM): extern WSAStartup extern WSACleanup extern socket extern Sleep extern ExitProcess extern accept extern listen extern bind struc in_addr .s_addr: resd 1 .size: endstruc struc sockaddr .sin_family: resw 1 .sin_port: resw 1 .sin_addr: resb in_addr.size .sin_zero: resb 8 .size: endstruc struc WSADATA .wVersion: resw 1 .wHighVersion: resw 1 .szDescription: resb 256 .szSystemStatus: resb 256 .iMaxSockets: resw 1 .iMaxUdpDg: resw 1 .lpVendorInfo: resq 1 .size: endstruc SECTION .bss ws_addr: resb sockaddr.size ws_wsa: resb WSADATA.size SECTION .data port: equ 777 global main main: mov rdx , [ws_wsa] mov rcx , 0x202 call WSAStartup mov r8 , 0 mov rdx , 1 mov rcx , 2 call socket mov r13 , rax mov dword [ws_addr + sockaddr.sin_family] , 1 mov qword [ws_addr + sockaddr.sin_addr] , 0 mov ax , port xchg ah , al mov [ws_addr + sockaddr.sin_port] , ax mov r8 , sockaddr.size mov rdx , [ws_addr] mov rcx , r13 call bind mov rdx , 13 mov rcx , r13 call listen mov r8 , 0 mov rdx , [ws_addr] mov rcx , r13 call accept mov rcx , 60000 call Sleep call WSACleanup mov rcx,rax call ExitProcess
То же не линкуется Код (Text): C:\Users\hackd\Desktop\NASM>nasm cmd.asm -f win64 -o cmd.obj C:\Users\hackd\Desktop\NASM>gcc cmd.obj -lws2_32 -m64 -o cmd.exe cmd.obj:cmd.asm:(.data+0x4): relocation truncated to fit: R_X86_64_32 against `.bss' cmd.obj:cmd.asm:(.data+0x2d): relocation truncated to fit: R_X86_64_32 against `.bss' cmd.obj:cmd.asm:(.data+0x39): relocation truncated to fit: R_X86_64_32 against `.bss' cmd.obj:cmd.asm:(.data+0x4b): relocation truncated to fit: R_X86_64_32 against `.bss' cmd.obj:cmd.asm:(.data+0x59): relocation truncated to fit: R_X86_64_32 against `.bss' cmd.obj:cmd.asm:(.data+0x7c): relocation truncated to fit: R_X86_64_32 against `.bss' collect2: error: ld returned 1 exit status в r13 socker handle от call socket
Код (ASM): stin_addr: istruc struc in_addr at in_addr.s_addr, dq 0 iend Вот у вас ошибка в строке 3. зачем еще раз объявляете struc in_addr (уберите слово struc ) будьте пожалуйста вниматльенее
Спасибо огромное, недоглядел, исправил. Ошибка cmd.asm:35: error: non-constant argument supplied to TIMES остается ссылается на конец структуры WSADATA endstruc