LINUX.ORG.RU

Конкурс на простейшую программу

 


0

1

Условие: составить кратчайшую программу на любимом языке и продемонстрировать её технлогию сборки, запуска….

Бью рекорд Hello world на классическом Си. Никаких заголовочных файлов и стандартных библиотек ! Впрочем, нестандартные тоже не нужны.

В вашем любимом редакторе пишем в файл simplest.c:

int main(int argc){
        return argc;
}

компиляция : gcc simplest.c

запуск с демонстраций вывода количества аргументов программы в качестве кодов её возврата :

./a.out ; echo $? 
./a.out - ; echo $? 
./a.out - - ; echo $? 

Ответ на: комментарий от luke

Чуть побольше, но зато полноценный ELF:

$ cat exit.b64
f0VMRgEBAQCLHCSwAc2AAAIAAwABAAAACIAECCwAAAAAAAAAAAAA
ADQAIAABAAAAAAAAAACABAgAAAAATAAAAEwAAAAFAAAAAAAAAA==

$ base64 -d exit.b64 > exit
$ chmod +x exit
$ ./exit 2 3; echo $?
3
anonymous
()
Ответ на: комментарий от RazrFalcon

Единственная прога на Си, которая не падает.

В любой достаточно сложной программе вне зависимости от используемого языка программирования есть ошибки, которые могут привести к падению программы.

anonymous
()
Ответ на: комментарий от avolver

Вопрос знатокам: сколько в данной программе уязвимостей?

theNamelessOne ★★★★★
()
echo 'public class T{ public static void main(String[] args){ System.out.println("hello w");}}'>T.java && javac T.java && java T

jtad
()
Последнее исправление: jtad (всего исправлений: 1)
Ответ на: комментарий от luke

Как впрочем и ТСа.

xD Я тебя с ТСом перепутал, сорян.

anonymous
()
Ответ на: комментарий от anonymous

Неубедительно

$ perl
8===D (!)
syntax error at - line 1, near "==="
Execution of - aborted due to compilation errors.
future_anonymous
()
Ответ на: комментарий от PolarFox

Если запуск не требуется, то кратчайшая программа которую проглотит компилятор ­— файл размером 0 байт.

Что значит «если запуск не требуется»?! Как минимум на двух языках вполне себе успешно запускается:

$ touch empty.lua
$ lua empty.lua
$ touch empty.scala
$ scala empty.scala
$
dimgel ★★★★★
()
Ответ на: комментарий от future_anonymous

Именно, они эквивалентны, поэтому я группирую как захочу. Приведенный мной вариант более читаем. То же самое с `succ`. Его стоит использовать при написании обобщенного кода, а в такой ерунде проще и нагляднее применять `(1+)`.

Siborgium ★★★★★
()
/// @see http://ru.cppreference.com/w/cpp/container/array
/// g++ -Wall -g -std=gnu++11 array.cpp -o array
#include <string>
#include <iterator>
#include <iostream>
#include <algorithm>
#include <array>

int main()
{
    // конструктор использует агрегатный инициализатор
    std::array<int, 3> a1{ {1,2,3} };  // требуются двойные фигурные скобки,
    std::array<int, 3> a2 = {1, 2, 3}; // за исключением операций присваивания
    std::array<std::string, 2> a3 = { {std::string("a"), "b"} };

    // поддерживаются обобщённые алгоритмы
    std::sort(a1.begin(), a1.end());
    std::reverse_copy(a2.begin(), a2.end(), std::ostream_iterator<int>(std::cout, " "));

    // поддерживается ranged for цикл
    for(auto& s: a3)
        std::cout << s << ' ';
}
                                                                                                                                                                             
  • issues
    • run too fast
anonymous
()

Нормальные пацаны в редакторе набирали сразу цифирками что-то типа mov ah,3 int 13h, сохраняли как com и винчестеру приходит пипец, а ты с хеловордом.

ilovewindows ★★★★★
()
Ответ на: комментарий от ilovewindows

Старо, но может быть ещё работает. Итак, три способа reboot для dos.

.model small
.code
	org 100h
start:
	int 19h			; Bootstrap loader
end start
.model small
.code
	org 100h
start:
	db 0EAh                 ; Jump to Power On Self Test - Cold Boot
	dw 0,0FFFFh
end start
.model small
.code
	org 100h
start:
	mov ah,0Dh
	int 21h                 ; DOS Services  ah=function 0Dh
				;  flush disk buffers to disk
	sti                     ; Enable interrupts
	hlt                     ; Halt processor
	mov al,0FEh
	out 64h,al              ; port 64h, kybd cntrlr functn
				;  al = 0FEh, pulse CPU reset
end start
beastie ★★★★★
()

Код был для соседней темы (про тривиальные шифрованные hello world'ы). Но, судя по всему, её удалили как дубль. Так что пусть будет здесь. 32-битный самосборный ELF без секций с одним PT_LOAD сегментом c флагами exec, read. Код особенно не укорачивал (аля whirlwind tutorial). Используется старый добрый xor по зашифрованному массиву .long элементов (вся hello-строка поксорена в обратном порядке, т.к. затем всё выводится через системный вызов write с адреса в стэке), разумеется ключ весьма легко реверсится (добавлять сюда полиморфные изыски наверное излишне). Использую gas (at&t синтаксис), код вырезан с помощью objcopy. Вообщем всё довольно просто и банально.

user@unix:~/cyberdelia$ 
user@unix:~/cyberdelia$ cat history.log
Script started on Fri May 22 00:00:11 2020
user@unix:~/cyberdelia$ cat > enc_hello.s

.equiv __NR_exit,  1
.equiv __NR_write, 4

.equiv __align,    4
.equiv __length,   168
.equiv __magic,    0xdeadbeef

elfheader:
    .byte 0x7F # EI_MAG0
    .byte 0x45 # EI_MAG1
    .byte 0x4C # EI_MAG2
    .byte 0x46 # EI_MAG3
    .byte 0x01 # EI_CLASS, 32-bit
    .byte 0x01 # EI_DATA, little endian
    .byte 0x01 # EI_VERSION
    .byte 0x00 # EI_OSABI
    .byte 0x00 # EI_ABIVERSION
    .byte 0x00 # /--.
    .byte 0x00 #    |
    .byte 0x00 #    |
    .byte 0x00 #    | EI_PAD
    .byte 0x00 #    |
    .byte 0x00 #    |
    .byte 0x00 # /--'

    .short 0x0002             # e_type, executable
    .short 0x0003             # e_machine, Intel architecture
    .long  0x00000001         # e_version
    .long  entry + 0x08048000 # e_entry, entry point address
    .long  progheader         # e_phoff
    .long  0x00000000         # e_shoff
    .long  0x00000000         # e_flags
    .short elfheadersize      # e_ehsize
    .short progheadersize     # e_phentsize
    .short 0x0001             # e_phnum
    .short 0x0000             # e_shentsize
    .short 0x0000             # e_shnum
    .short 0x0000             # e_shstrndx
.equiv elfheadersize, progheader - elfheader

progheader:
    .long 0x00000001  # p_type, PT_LOAD  /--------.
    .long 0x00000000  # p_offset                  |
    .long 0x08048000  # p_vaddr                   |
    .long 0x08048000  # p_paddr                   |
    .long filesize    # p_filesz                  |
    .long filesize    # p_memsz                   |
    .long 0x00000005  # p_flags, exec(1)/read(4)  |
    .long 0x00001000  # p_align  /----------------'
.equiv progheadersize, entry - progheader

.section .text
entry:
    movl $_table + 0x08048000, %esi
    imul $0, %ecx
_casting:
    movl (%ecx, %esi), %eax
    xorl $__magic, %eax
    pushl %eax
    addl $__align, %ecx
    cmpl $__length, %ecx
    jne _casting

    movl $__NR_write, %eax
    movl $1, %ebx
    movl $__length, %edx
    movl %esp, %ecx
    .byte 0xcd
    .byte 0x80

    movl $__NR_exit, %eax
    imul $0, %ebx
    .byte 0xcd
    .byte 0x80
_table:
    .long 0xd4a790c1, 0xf0d98f82, 0xacc8d6cf, 0xb1d99e95, 0xaac8db9d, 0xb98d908b
    .long 0xbfc8dacf, 0xaac2d0cf, 0xadc49e97, 0xa88d9296, 0xbfda9e8a, 0xb6d99e96
    .long 0xbc8d928b, 0xb0cc9ee5, 0xd48d8edd, 0xee9f9ec6, 0xbd859e9d, 0xb1d9dd8a
    .long 0xb4c3d7b0, 0x98e1fbcf, 0xa7cf9e9a, 0xac83d99d, 0xb183c69a, 0xb0c4d2cf
    .long 0xacc2d8cf, 0xa7c1d28e, 0xb7cedb9f, 0xadc89ee5, 0xfec3db9b, 0xaac4cc98
    .long 0xfededf98, 0xfec9d29d, 0xb1da9e80, 0xb2c1db87, 0xfed9d78d, 0xf39f8dcf
    .long 0xbac8ca9f, 0xa7dfdd81, 0xbb8dc783, 0xaec0d79c, 0xfeded787, 0xaa8db4cf
.equiv filesize, end - elfheader
end:

^Z
[1]+  Stopped                 cat > enc_hello.s
user@unix:~/cyberdelia$ as enc_hello.s -o enc_hello.o
user@unix:~/cyberdelia$ objcopy -O binary enc_hello.o enc_hello
user@unix:~/cyberdelia$ chmod +x enc_hello
user@unix:~/cyberdelia$ 
user@unix:~/cyberdelia$ 
user@unix:~/cyberdelia$ ./enc_hello 
 
 this simply encrypted 32-bit hello world was written 
 especially for linux.org.ru by ELF_injector (c) 2020 

 and, by the way, vx is not dead. greetz to herm1t...

user@unix:~/cyberdelia$ 
user@unix:~/cyberdelia$ 
user@unix:~/cyberdelia$ hexdump -C enc_hello
00000000  7f 45 4c 46 01 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 03 00 01 00 00 00  54 80 04 08 34 00 00 00  |........T...4...|
00000020  00 00 00 00 00 00 00 00  34 00 20 00 01 00 00 00  |........4. .....|
00000030  00 00 00 00 01 00 00 00  00 00 00 00 00 80 04 08  |................|
00000040  00 80 04 08 35 01 00 00  35 01 00 00 05 00 00 00  |....5...5.......|
00000050  00 10 00 00 be 8d 80 04  08 6b c9 00 8b 04 31 35  |.........k....15|
00000060  ef be ad de 50 83 c1 04  81 f9 a8 00 00 00 75 ec  |....P.........u.|
00000070  b8 04 00 00 00 bb 01 00  00 00 ba a8 00 00 00 89  |................|
00000080  e1 cd 80 b8 01 00 00 00  6b db 00 cd 80 c1 90 a7  |........k.......|
00000090  d4 82 8f d9 f0 cf d6 c8  ac 95 9e d9 b1 9d db c8  |................|
000000a0  aa 8b 90 8d b9 cf da c8  bf cf d0 c2 aa 97 9e c4  |................|
000000b0  ad 96 92 8d a8 8a 9e da  bf 96 9e d9 b6 8b 92 8d  |................|
000000c0  bc e5 9e cc b0 dd 8e 8d  d4 c6 9e 9f ee 9d 9e 85  |................|
000000d0  bd 8a dd d9 b1 b0 d7 c3  b4 cf fb e1 98 9a 9e cf  |................|
000000e0  a7 9d d9 83 ac 9a c6 83  b1 cf d2 c4 b0 cf d8 c2  |................|
000000f0  ac 8e d2 c1 a7 9f db ce  b7 e5 9e c8 ad 9b db c3  |................|
00000100  fe 98 cc c4 aa 98 df de  fe 9d d2 c9 fe 80 9e da  |................|
00000110  b1 87 db c1 b2 8d d7 d9  fe cf 8d 9f f3 9f ca c8  |................|
00000120  ba 81 dd df a7 83 c7 8d  bb 9c d7 c0 ae 87 d7 de  |................|
00000130  fe cf b4 8d aa                                    |.....|
00000135
user@unix:~/cyberdelia$ 
user@unix:~/cyberdelia$ wc -c enc_hello && echo bye
309 enc_hello
bye
user@unix:~/cyberdelia$ 
user@unix:~/cyberdelia$ exit
exit

Script done on Fri May 22 00:24:11 2020
user@unix:~/cyberdelia$ 
user@unix:~/cyberdelia$ 

ELF_injector
()
Ответ на: комментарий от ELF_injector

вместо размерных постфиксов movl movq(и для остальных команд тоже) можно писать просто mov, там где из аргуметов ясен размер. всё таки at&t синтаксис чуть менее всратый, чем я думал

anonymous
()
Ответ на: комментарий от anonymous

вместо размерных постфиксов можно писать просто mov, там где из аргуметов ясен размер

Я знаю, но я привык явно указывать постфиксы - код становится нагляднее и это дисциплинирует. Это дисциплинирует когда явно указываешь постфикс - вот тут ты работаешь с 32-битной шириной (i.e. addl, subl, movl), здесь - с 16-битной шириной, т.е. c 2-х байтными значениями (i.e. movw, addw, subw), здесь - с 8-битной шириной (i.e. testb, movb, xorb), ну а здесь - с 8-ми байтной шириной (i.e. movq, sarq, orq, leaq, cmpq) и тп. Для меня это вопрос стиля, даже не смотря на то, что размерность понятна по операндам.

ELF_injector
()
Ответ на: комментарий от FilosofeM

Котлин всех порвал:

Нет, это C всех порвал. Лень читать тред, не знаю, было или нет:

$ cat main.c
main;
$ gcc main.c
$ ./a.out 
Segmentation fault (core dumped)
EXL ★★★★★
()

уже предлагали?

anonymous
()
Ответ на: комментарий от anonymous

Нельзя, без return – UB в C89.

UB – не синтактическая ошибка.

anonymous
()

аналог кода ТС на sh уже предлагали?

exit $#

кстати, у С есть и более простая функция печати: puts

zudwa
()
19 апреля 2021 г.

Уже был знаменитый скрипт, который грохает файлы на диске?

anonymous
()

#include мошеник уже отбоянили?

#include ...

где ...

qulinxao3
()
Ответ на: комментарий от LongLiveUbuntu

Oberon (Component Pascal) для моего порта под Haiku, без рантайма:

MODULE A;
	IMPORT P := HaikuPosix;
	
	PROCEDURE Do*;
		VAR res: INTEGER;
	BEGIN
		res := P.puts("This is a test.");
		P.exit(0);
	END Do;
	
END A.

(!)DevCompiler.Compile
(!)DevElfLinker2.LinkExe A.Do A := A

Скриншот.

Размер бинарника: 940 байт.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от LongLiveUbuntu

BEGIN не обязателен. И лучше не использовать имена только из больших букв длиннее одного символа (STUB) они зарезервированы для ключевых слов. Минимальный модуль будет такой:

MODULE A; END A.
X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 3)
Ответ на: MS-DOS 1.0 от luke

ммм ком файлы. самый лучший формат )

interrupted
()

Кстати, а у кого есть пропатченный на --no-preserve-root патч Бармина?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от LongLiveUbuntu

Fortran

END в последней строчке, мне напомниле на вечно живой учебный Pascal но, вошедший в топ-20 последних месяцев Fortran.

Android
() автор топика
Ответ на: комментарий от ddidwyll

Erlang

Elixir с ходу , конечно занятно, особенно первый вариант. Но есть ли там код возврата сценария, который можно в ОС передать? И потом, можно нечто подобное на его базовом языке Erlang изобразить? А то я пока только команды q(). и help(). освоил.

Android
() автор топика

Test.java

public class Test {
    public static void main(String... args) {
	System.exit(args.length);
    }
}
$ javac Test.java
$ java Test 1 2 3; echo $?
3
bvn13 ★★★★★
()
Ответ на: Erlang от Android

Но есть ли там код возврата сценария, который можно в ОС передать?

➜  ~ echo "System.halt(1)" > app.exs
➜  ~ elixir app.exs
➜  ~ echo $?
1

Elixir с ходу , конечно занятно

На мой вкус после php, js и go - совсем другой уровень ощущений от кодинга, приятно, просто и не мешает.

И потом, можно нечто подобное на его базовом языке Erlang изобразить

Можно то скорее всего можно, но подробнее не скажу, не вижу особого смысла в чистом erlang'е - всё то же даёт elixir, но приятнее.

ddidwyll ★★★★
()
Ответ на: комментарий от anonymous

Нельзя, без return – UB в C89.

Да, но что нельзя на Си, можно в C++:

int main(){}

Вся королевская рать диагностика clang (включено 'everything') молчит. Важное замечение от clang-tidy :)

warning: use a trailing return type for this function [modernize-use-trailing-return-type]
int main(){}
~~~ ^
auto       -> int
nasecom
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.