Size: a a a

Ассемблер

2021 August 19

ВВ

Вячеслав Васютин... in Ассемблер
Если представить на минуту, что скобки () могут сохранять данные в регистр сразу же, я бы сделал так:
mov rax, rbx($-msg)
источник

s

s54816 in Ассемблер
mov rax,$-msg
источник

ВВ

Вячеслав Васютин... in Ассемблер
Даже так можно?
источник

d

disba1ancer in Ассемблер
Только если команда сразу после строки
источник

s

s54816 in Ассемблер
Можно, но ты хочешь другого. Ты хочешь макрос string типа такого:

struc string [args] {
. db args,0
.size = $ - .
}
xxx string 'abc'
...
mov rax,xxx.size
источник

d

disba1ancer in Ассемблер
Интересно, а на гнутом такое есть?
источник

s

s54816 in Ассемблер
Какие-то макросы там есть. Давай попробуем.
источник

d

disba1ancer in Ассемблер
Мне бы ещё что-то вроде virtual уж больно удобно с его помощью определять стекфрейм
источник

ST

Saenro T in Ассемблер
Так FASM же многопроходной, разве нет?
источник

d

disba1ancer in Ассемблер
А это тут при чём?
источник

ST

Saenro T in Ассемблер
А что значит "команда сразу после строки"?
источник

ST

Saenro T in Ассемблер
Ааа
источник

ST

Saenro T in Ассемблер
Понятно) Вопрос снят из-за $. Тупанул)
источник

E

Entusiast in Ассемблер
format ELF executable
entry start

macro Elf32_Sym name,value,size,bind,type,other,shndx
{
dd name+0
dd value+0
dd size+0
db (bind+0) shl 4 + (type+0)
db other+0
dw shndx+0
}
virtual at 0
Elf32_Sym
sizeof.Elf32_Sym = $
end virtual

macro Elf32_Rel offset,symbol,type
{
 dd offset+0
 dd (symbol+0) shl 8 + (type+0)
}
virtual at 0
Elf32_Rel
sizeof.Elf32_Rel = $
end virtual

DT_NULL    = 0
DT_NEEDED  = 1
DT_HASH    = 4
DT_STRTAB  = 5
DT_SYMTAB  = 6
DT_RELA    = 7
DT_RELASZ  = 8
DT_RELAENT = 9
DT_STRSZ   = 10
DT_SYMENT  = 11
DT_REL     = 17
DT_RELSZ   = 18
DT_RELENT  = 19

STB_LOCAL  = 0
STB_GLOBAL = 1
STB_WEAK   = 2

STT_NOTYPE  = 0
STT_OBJECT  = 1
STT_FUNC    = 2
STT_SECTION = 3
STT_FILE    = 4

R_386_32       = 1

segment interpreter readable

db '/lib/ld-linux.so.2',0

segment dynamic readable

 dd DT_NEEDED,_libc-strtab
 dd DT_STRTAB,strtab
 dd DT_STRSZ,strsz
 dd DT_SYMTAB,symtab
 dd DT_SYMENT,sizeof.Elf32_Sym
 dd DT_REL,rel
 dd DT_RELSZ,relsz
 dd DT_RELENT,sizeof.Elf32_Rel
 dd DT_HASH,hash
 dd DT_NULL,0

segment readable writeable

 symtab:
  Elf32_Sym                                            ; 0 - NULL
  Elf32_Sym _system-strtab,0,0,STB_GLOBAL,STT_FUNC,0,0 ; 1 - system
  Elf32_Sym _exit-strtab,0,0,STB_GLOBAL,STT_FUNC,0,0   ; 2 - exit

 strtab:
 _null db 0
 _libc db 'libc.so.6',0
 _system db 'system',0
 _exit db 'exit',0
 strsz = $-strtab

 rel:
  Elf32_Rel system,1,R_386_32
  Elf32_Rel exit,2,R_386_32
 relsz = $-rel

 hash:
  dd 1,3       ; size of bucket and size of chain
  dd 0         ; fake bucket, just one hash value
  times 3 dd % ; chain for all symbol table entries

segment readable executable

start:

       push    msg
       call    [system]

       call    [exit]

segment readable writeable

system dd 0
exit dd 0

msg db 'echo "Test"',0xA,0

https://board.flatassembler.net/topic.php?t=10660
источник

E

Entusiast in Ассемблер
Вместо msg -> "echo 'Test'" -> "rm -rf всё что хочешь"
источник

E

Entusiast in Ассемблер
Ну, соотв. это импорт таблица. Туда можно и варианты с GCC завалить
источник

s

s54816 in Ассемблер
Либц — это нечестный способ.
источник

E

Entusiast in Ассемблер
Да, наверное.
Но лёгкий
источник

d

disba1ancer in Ассемблер
в случае с линуксом вполне честный, а таскать номера прерываний ради совместимости бред, я вообще удивлён почему к линуксу не сделали liblinuxapi.so
источник

d

disba1ancer in Ассемблер
ибо этот glibc жуткий монстр, имхо, в библиотеке языка си должен быть только язык си, а не апи всей системы
источник