Что такое код is_writeable


Содержание

ГЛАВА 7. Файловый ввод/вывод и файловая система

С открытыми файлами выполняются две основные операции — чтение и запись.

is_writeable()

Функция is_writeable() позволяет убедиться в том, что файл существует и для него разрешена операция записи. Возможность записи проверяется как для файла, так и для каталога. Синтаксис функции is_writeable():

Одно важное обстоятельство: скорее всего, РНР будет работать под идентификатором пользователя, используемым web-сервером(как правило, «nobody»). Пример использования is_writeable() приведен в описании функции fwrite().

fwrite()

Функция fwrite() записывает содержимое строковой переменной в файл, заданный файловым манипулятором. Синтаксис функции fwrite():

Если при вызове функции передается необязательный параметр длина, запись останавливается либо после записи указанного количества символов, либо при достижении конца строки. Проверка возможности записи в файл продемонстрирована в следующем примере:

Функция fputs() является псевдонимом fwrite() и может использоваться всюду, где используется fwrite().

fputs()

Функция fputs() является псевдонимом fwrite() и имеет точно такой же синтаксис. Синтаксис функции fputs():

Лично я предпочитаю использовать fputs(). Следует помнить, что это всего лишь вопрос стиля, никак не связанный с какими-либо различиями между двумя функциями.

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

Network Stream. Writeable Свойство

Определение

Получает значение, указывающее, предусмотрена ли запись в объект NetworkStream. Gets a value that indicates whether the NetworkStream is writable.

Значение свойства

Значение true , если данные могут быть записаны в поток; в противном случае — значение false . true if data can be written to the stream; otherwise, false . Значение по умолчанию — true . The default value is true .

Примеры

В следующем примере CanCommunicate кода свойство Writeable проверяет свойство, чтобы определить, является ли объект NetworkStream доступным для записи. In the following code example, the CanCommunicate property checks the Writeable property to determine if the NetworkStream is writable.

Комментарии

NetworkStream ДляWriteable использования свойства необходимо наследовать от класса. You must derive from the NetworkStream class to use the Writeable property. Если Writeable имеет true значение ,NetworkStream разрешает вызовы метода.Write If Writeable is true , NetworkStream allows calls to the Write method. Можно также определить, NetworkStream является ли доступ доступным для записи, проверив общедоступное CanWrite свойство. You can also determine whether a NetworkStream is writable by checking the publicly accessible CanWrite property.

Свойство задается при NetworkStreamинициализации. Writeable The Writeable property is set when the NetworkStream is initialized.

Re Writeable

Универсальный русско-английский словарь . Академик.ру . 2011 .

Смотреть что такое «Re Writeable» в других словарях:

writeable — var. writable a … Useful english dictionary

fasm — flat assembler Тип компилятор Разработчик Томаш Грыштар Операционная система … Википедия

Control store — A control store is the part of a CPU s control unit that stores the CPU s microprogram. It is usually accessed by a microsequencer. Early control stores were implemented as a diode array accessed via address decoders, a form of read only memory.… … Wikipedia

Floppy disk — Floppy redirects here. For other uses, see Floppy (disambiguation). 8 inch, 5 1⁄4 inch, and 3 1⁄2 inch floppy disks … Wikipedia

Microcode — is a layer of hardware level instructions and/or data structures involved in the implementation of higher level machine code instructions in many computers and other processors; it res >Wikipedia

Laptop — A desktop replacement laptop with its 18.4 inch screen showing its technical specifications. A laptop, also called a notebook,[1][2] is a personal computer for … Wikipedia

Fork bomb — The concept behind the fork bomb – the processes recursively fork until a denial of service or a crash occurs In computing, the fork bomb is a form of denial of service attack against a computer system which makes use of the fork operation (or… … Wikipedia

WCS — may stand for:In Computing and Technology may refer to: *Web Coverage Service, part of a specification for Internet map services *Windows CardSpace, (codenamed InfoCard), software component of .NET Framework 3.0 *Windows Color System, a software… … Wikipedia

DVD Shrink — Screenshot Developer(s) DVD Shrink … Wikipedia

CD-ROM — Media type Optical disc Capacity 194 MiB (8 cm) 650–900 MiB (12 cm) Read mechanism 150 KiB/s (1×) 10,800 KiB/s (72×) Write mechanism 150 KiB/s (1×) 8,400 KiB/s (56×) Standard … Wikipedia

Fasm — flat assembler Тип компилятор Разработчик Томаш Грыштар ОС … Википедия

Что такое код is_writeable

Determines whether the specified disk is writable.

To perform this operation, call the DeviceIoControl function with the following parameters.

Parameters

A handle to the device. To retrieve a device handle, call the CreateFile function.

The control code for the operation. Use IOCTL_DISK_IS_WRITABLE for this operation.

Not used with this operation; set to NULL.

Not used with this operation; set to zero.

Not used with this operation; set to NULL.

Not used with this operation; set to zero.

A pointer to a variable that receives the size of the data stored in the output buffer, in bytes.

If lpOverlapped is NULL, lpBytesReturned cannot be NULL. Even when an operation returns no output data and lpOutBuffer is NULL, DeviceIoControl makes use of lpBytesReturned. After such an operation, the value of lpBytesReturned is meaningless.

If lpOverlapped is not NULL, lpBytesReturned can be NULL. If this parameter is not NULL and the operation returns data, lpBytesReturned is meaningless until the overlapped operation has completed. To retrieve the number of bytes returned, call GetOverlappedResult. If hDevice is associated with an I/O completion port, you can retrieve the number of bytes returned by calling GetQueuedCompletionStatus.

If hDevice was opened without specifying FILE_FLAG_OVERLAPPED, lpOverlapped is ignored.

If hDevice was opened with the FILE_FLAG_OVERLAPPED flag, the operation is performed as an overlapped (asynchronous) operation. In this case, lpOverlapped must point to a valid OVERLAPPED structure that contains a handle to an event object. Otherwise, the function fails in unpredictable ways.

For overlapped operations, DeviceIoControl returns immediately, and the event object is signaled when the operation has been completed. Otherwise, the function does not return until the operation has been completed or an error occurs.

Return value

If the disk is writeable and the operation completes successfully, DeviceIoControl returns a nonzero value.

If the disk is not writeable or the operation fails, DeviceIoControl returns zero. To get extended error information, call GetLastError. If the disk is read-only, GetLastError returns ERROR_WRITE_PROTECT.

World Writable Code Is Bad, MMMMKAY

Introduction

One of the core designs of the Android operating system’s sandbox is to assign different applications a unique user identifier (UID). By doing this, Android reuses the underlying Linux kernel and filesystem properties to enforce boundaries. There are certain situations where apps may share the same UID, but that requires they be signed with the same certificate and explicitly request the same UID. The vast majority of the apps on the play store get installed as their own user. Because Android relies on the Linux file permission model, the files an application creates also have a set of read/write/execute permissions for the owner, group, and others.

This blog post will go into detail about some apps and libraries still making mistakes and show how they may be leveraged for arbitrary code execution and privilege escalation through permission stealing (CWE-732, CWE-250). For the examples below, we’re using a small payload which leverages the logwrapper and id tools to demonstrate that code execution has taken place and what UID, groups, and selinux context our code is running as. This output will show up in the system logs.

Please note that following with our NowSecure Disclosure Policy we disclose “Basic App Vulnerabilities” immediate on discovery to both users and developers. Specifically, users of the apps named in the article can avoid the vulnerabilities by uninstalling the application until the developer applies fixes.

Updates

6/18/2015 – The LiveChurch.tv’s ‘Bible’ has been updated on the play store and the Vitamio library has been removed. As of version 6.0.4, the app does not contain the vulnerable code.

Background

The file permission system, described here, can be difficult to fully understand at first. While these numbers (aka modes) appear close numerically, 0770 has immensely different security and privacy implications for a file than 0777. In our analyses of apps, we too frequently see programmers choose careless permissions for their files and grant other unix users (i.e., other apps) the ability to read and write files which are meant to be private and even despite Google’s warnings regarding world readable and world writeable modes.

Creating world-readable files is very dangerous, and likely to cause security holes in applications. It is strongly discouraged; instead, applications should use more formal mechanism for interactions such as ContentProvider, BroadcastReceiver, and Service.

Case #1, Poweramp Music Player

The Poweramp Music Player app uses lax file permissions for preference files and some of its executable code.

From the above, we can see that both of the native code libraries in the files directory are writable by anybody on the system (world-writable), along with three of the XML files in the shared_prefs folder. The latter of these is interesting because it allows any other application installed to modify Poweramp’s settings. This means other apps can change the way Poweramp behaves and if there were any sensitive data in those XML files such as username and password, it would be ripe for the picking.

But, we can try to do better than that. If we can overwrite one of the files/lib*.so files and get Poweramp to load our code, then we can assume their UID, groups, and all of their Android permissions. As of this writing, the play store description describes the permissions as

  • Photos/Media/Files
    • modify or delete the contents of your USB storage
    • read the contents of your USB storage
  • Device ID & call information
    • read phone status and identity
  • Other
    • disable your screen lock
    • change your audio settings
    • pair with Bluetooth devices
    • modify system settings
    • full network access
    • send sticky broadcast
    • prevent device from sleeping
    • view network connections

From a developer’s point of view, that gives us access to the following manifest permissions:

Attempt #1:
Lets do a quick test to verify that we can (A) overwrite their file and (B) get Poweramp to try to load an ELF that isn’t theirs.

So, yes, we can simply overwrite the file. it is now 5 bytes long. Unfortunately, when we start the application, in logcat, we see the following:

and our file has been overwritten

The application has given us a hint that because the file’s size did not match what it expected, it overwrote it. So, what happens if we create a file with the correct size?

Then start the app and watch logcat… BAM!

This dlopen() line shows that the app did attempt to load our library. Since it was not a valid ELF file, it was rejected and Poweramp overwrote it again. So now we know that the app will run our ELF if we simply replace their library with a valid one. However, this will almost certainly break some functionality of the app. It will either crash or the user will notice that there’s no music playing. What we can do is create a backup copy of their library, insert ours in its place, and then call through to the original library that we put in a safe place. Source code for something that does just that can be found here.

First, this app truncates libaudioplayer_native.so to 0 bytes and starts Poweramp so that app will rewrite a correct version out to disk. Then, it backs up the original lib and copies a libtest.so out of its assets in place of libaudioplayer_native.so . After its done that, it restarts Poweramp to get it to load the new app. The replacement code is simple enough but does demonstrate getting an app to run code which its developer never intended for it to run. The following lines in logcat show that our code works (abbreviated for clarity).

Илон Маск рекомендует:  Фракталы вокруг нас

The section u > comes from Poweramp executing our payload code. It shows that we have been granted the groups for writing to external storage, bluetooth, and internet. In addition to these, we’d also have Poweramp’s android permissions for dismissing the lockscreen, adjusting system settings, wakelocks, and READ_PHONE_STATE (access your imei, etc).

Case #2 QPython – Python for Android

For historical reasons, Android has ‘external’ storage, which is not usually external to the device. This is a directory which nowadays is managed by a fuse program emulating a fat32 filesystem. Because fat32 has no concept of file owners and groups, every file in external storage is accessible to apps with the proper android permission. From a privacy standpoint, it makes sense, then, that an application shouldn’t store sensitive data here. Google’s docs for storage say something to this effect, too.

In most devices, the external storage is mounted with the noexec flag, which means that programs and shared libraries cannot be run from here. However, there are many apps which store interpreted code and VM bytecode on external storage, which is then processed as instructions by another binary. Some examples of languages using interpreted code and VM bytecode are javascript, python, java, shell script, lua, php, and html. When an application loads this code from a file which writable by other applications, it allows those other apps to elevate their privileges by stealing permissions. We will demonstrate this by attacking the QPython – Python for Android app.

The QPython application appears to have a full python 2.7 installation packaged inside it, including a libs , site-packages , pip folders, setuptools, and even some scripts and example projects. Unfortunately, these are all stored on the external storage. Python contains a handful of APIs for running subprocesses. This means that we can insert some payload code into any one of the interpreted files and when the app runs them, it will run our own code. And when our code runs, it will have all the permissions that QPython has. The manifest lists the following:

While the play store describes these as:
Version 1.1.1 can access:

  • Location
    • approximate location (network-based)
    • precise location (GPS and network-based)
  • Photos/Media/Files
    • modify or delete the contents of your USB storage
    • access USB storage filesystem
    • read the contents of your USB storage
  • Camera
    • take pictures and videos
  • Microphone
    • record audio
  • Wi-Fi connection information
    • view Wi-Fi connections
  • Other
    • access SurfaceFlinger
    • full network access
    • view network connections
    • control Near Field Communication
    • pair with Bluetooth devices
    • install shortcuts
    • prevent device from sleeping
    • control vibration
    • control flashlight
    • read battery statistics

Building an app to take advantage of this vulnerability is much less involved than one might imagine. These are python scripts and it only takes scriptkiddie level skills to abuse them. A proof-of-concept can be seen here. This code checks if QPython is installed, and if so, it writes out

to /sdcard/com.hipipal.qpyplus/lib/python2.7/site-packages/sitecustomize.py . This sitecustomize.py script is loaded by the interpreter automatically. To see it in action, watch logcat while we open the QPython app’s python interpreter –

We can see from the output that we have been granted bluetooth and internet unix groups. We also have access to all those other interesting permissions listed in the app’s manifest.

Case #3 Vitamio SDK

Our final example affects the Vitamio SDK, which is used by thousands of applications. Vitamio is a multimedia library that developers may include in their app to help them play various types of audio and video files. The vast majority of these apps we’ve seen are by developer CTS cBroadcasting who managed to rack up a couple thousand apps all on their own. Some popular examples from other developers include LiveChurch.tv’s ‘Bible’ who claim 180M+ users worldwide and UC Browser HD and FM Radio, each with between 10 and 50 million downloads from the Play Store.

When the Vitamio library is initialized, it creates a world-writable directory and then extracts its payload of several native libraries into this directory, with world-writable permissions. This can be seen by disassembling their libvinit.so native library. The Java_io_vov_vitamio_Vitamio_native_initializeLibs function creates calls through to a utility function to mkdir with 0x1ff for the mode parameter. This 0x1ff translates to 0777 in octal, or read, write, and execute permission for all users. Then it procedes to create files in a loop and chmod them to 0x1b6. This 0x1b6 translates to 0666, or read and write permission for all users.

Part of the helper function to create 0777 directories:

Section of Java_io_vov_vitamio_Vitamio_native_initializeLibs which creates 0666 files:

Our attack scenario is almost identical to the Poweramp attack. We will pick an app using Vitamio, then try to swap out one of its native libraries with our own and cause it to run our own code.

Our sample app this time is Video Player for Android with 10M+ downloads. We can first install the app and run it 1 time so it extracts its libraries.

Now, lets pick one and nuke it!

And when we use the app to try and watch a video, we see this in logcat –

So, now we know the app will try to execute our code. Let’s give it some. Here’s our main.c for our native library –

Compile this with the NDK. Then move the original libvplayer.so to libvplayer_orig.so and push our library in its place. SE for Android doesn’t directly allow us to “adb push” and overwrite this file, but we can push it to /data/local/tmp and then copy it into place.

And now, we try to play a sound from within the Video Player app, and watch for our code to call out to us in logcat –

… and WHAMMY. Similar attacks are possible with the other applications using the Vitamio library. Its just a matter of finding the proper codepath to trigger the app to start playing a media file with the library. Some codepaths may even be exposed by an intent which may be fired off by the attacking app, and lowering the amount of user interaction required.

Conclusion

The unix filesystem properties play a very important role is keeping an application’s data safe from other apps and protecting user privacy. Developers should pay close attention when setting these permissions to avoid leaking its private data to other apps or being a gateway for apps to escalate by stealing their permissions. Developers who are not familiar with the concepts behind these properties should take the time to study up a bit.

While the examples outlined in this blog demonstrated gaining code execution, there can be very serious consequences for an app simply storing data in a world readable file. At NowSecure, we scrutinize a lot of apps. Developers seem to love storing data such as usernames and passwords in xml and sqlite files. This in itself is considered a bad idea. When these apps then go and make the file readable by all other apps, they are basically just handing this sensitive data out on a silver platter. In apps dealing with your real, physical money, such as a banking app, a simple mistake like this can make for a very bad day.

There are many different calls a developer may use to set file and directory permissions. The Android Java apis have openFileOutput, openOrCreateDatabase, and setWritable. It is also not uncommon to find a Runtime.exec call with chmod 0777 /path/to/some/file . Developers using native code have the opportunity to set file permissions with creat, open, and chmod. These lists are nowhere near all-inclusive. There are many, many more ways to set permissions for the files an application creates. Some IDEs include support for developers when using these apis. Google’s Android Studio will show a warning if the user attempts to use the depreciated Context.MODE_WORLD_WRITEABLE. Developers chosing to write their code with a text editor such as vi and compile via command line do not automatically get these warnings when creating a file that is world writable and should exercise even more caution.

All of the attacks demonstrated here are local attacks. However, it is not difficult to chain one of these attacks with and arbitrary file write by a network attacker as described here and here . By combining these two vulnerabilities, there is a possibility for a remote attacker to gain arbitrary code execution. What’s more, these two vulnerabilities do not even need to be in the same application.

Standardize & Scale Mobile App Security Testing

This reference guide frames the challenge of securing an ever-growing mobile app portfolio with finite resources. Learn how to standardize and scale mobile app security testing using the Mobile Security Project from the Open Web Application Security Project (OWASP).

section ‘. > ⇐ Предыдущая Стр 8 из 8

Столько кода, и ничего особенного в результате. В MessageBox хотя бы присутствовала кнопка ОК, а тут — пустое окно. Не волнуйтесь: как только мы разберемся с устройством простейшего окна, мы сразу же перейдем к навешиванию на него прочих элементов. Используя MessageBox, мы были ужасно ограничены набором стандартных параметров этой функции. Кроме того, программа не могла продолжать исполняться до тех пор, пока пользователь не прореагирует нажатием кнопки в окошке или его закрытием. В случае использования окна программа может исполняться, параллельно реагируя на действия пользователя. Сразу будет нелегко понять алгоритм работы окна, но, как только вы его поймете, все остальное пойдет намного легче. Приступаем к разбору полетов. В секции данных после объявления трех текстовых строк (класс окна, его заголовок, сообщение об ошибке) объявляются две структуры данных. Первая — WNDCLASS — структура класса окна. Она описана в файле FASM\INCLUDE\EQUATES\USER32.INC (смотрим файл прямо в компиляторе или через блокнот — кому как удобно) и содержит 10 атрибутов класса окна: style — стиль окна; lpfnWndProc — указатель на процедуру обработки сообщений, посланных окну; cbClsExtra — количество дополнительных байт в памяти для данной структуры; cbWndExtra — количество дополнительных байт в памяти для данных, присоединенных к окну; hInstance — идентификатор приложения, создавшего окно; hIcon — идентификатор иконки окна; hCursor — идентификатор курсора окна; hbrBackground — цвет фона окна; lpszMenuName — указатель на имя меню окна; указатель на имя класса. Вторая — MSG — структура сообщения. Описана там же, где и первая. Состоит из шести элементов: hwnd — идентификатор окна — получателя сообщения; message — сообщение; wParam — дополнительная информация о сообщении; lParam — дополнительная информация о сообщении; time — время отправки сообщения; pt — координаты курсора на время отправки сообщения. Последний элемент, кстати, тоже является структурой, которая описана в том же файле. Это наглядный пример вложенной структуры. Не старайтесь все сразу запомнить — просто примите к сведению. После объявления структур wc будет считаться указателем на первый байт структуры данных, созданной в соответствии с шаблоном WNDCLASS, а msg — указателем на MSG. Элементам структуры wc присваиваются соответствующие значения, разделенные запятыми (в основном пока что ноли). Значения элементов структуры msg считаются сейчас неопределенными — хотя на практике они будут иметь нулевые значения, правильно считать их значения неопределенными. В тексте программы можно обращаться к отдельным элементам структуры, например, wc.hCursor или wc.hIcon, хотя в оперативной памяти все данные будут просто идти друг за другом безо всяких пометок. Элементы структур для 32-битных версий windows обычно имеют размер 32 бита — это 4 байта или двойное слово (dword). Поэтому в описании структуры написано dd (data in dwords). Следовательно, мы могли бы заменить, например, wc.hInstance на wc+16, потому что элементы структуры wc в адресном пространстве будут выглядеть примерно так:

Элемент Адрес
wc.style wc+0
wc.lpfnWndProc wc+4
wc.cbClsExtra wc+8
wc.cbWndExtra wc+12
wc.hInstance wc+16
wc.hIcon wc+20
wc.hCursor wc+24
wc.hbrBackground wc+28
wc.lpszMenuName wc+32
wc.lpszClassName wc+36

Можно было бы сейчас не вдаваться в эти подробности, но лучше, если вы сразу получите правильное представление о размещении данных в памяти. Теперь попробуем разобраться с исполняемым кодом (section ‘.code’). Функция GetModuleHandle возвращает в eax идентификатор исполняемого модуля. Она имеет всего один параметр — указатель на строку — имя модуля (exe или dll). Если параметр равен нулю, то функция возвращает идентификатор вызвавшего функцию модуля, то есть нашей программы. Этот идентификатор нужен нам для заполнения элемента wc.hInstance, поэтому следующей командой мы сразу помещаем в этот элемент содержимое eax. LoadIcon загружает указанную иконку из ресурсов исполняемого файла. Первый параметр — идентификатор исполняемого файла или ноль для загрузки стандартной иконки. Второй параметр — строка — имя иконки из ресурсов либо идентификатор стандартной иконки, если первый параметр ноль. В нашем случае иконка стандартная. IDI_APPLICATION — это константа — ее и идентификаторы других стандартных иконок вы легко отыщете все в том же EQUATES\USER32.INC. Возвращаемое значение — идентификатор загруженной иконки, который мы тут же помещаем в wc.hIcon. LoadCursor работает по аналогии. Идентификаторы стандартных курсоров вы найдете чуть выше идентификаторов иконок. Теперь, когда все необходимые данные структуры wc находятся на своих местах, вызывается функция RegisterClass. Единственный параметр этой функции — указатель на структуру, содержащую описание класса окна. Если класс был успешно зарегистрирован, возвращаемое значение будет отлично от нуля. Если по каким-либо причинам не удалось зарегистрировать класс, то в eax вернется ноль. Исходя из этого, мы сравниваем eax и 0 (cmp) и в случае равенства прыгаем на метку ошибки (je error). Если не равно нулю — значит, все в порядке, и мы переходим к созданию окна. Функция CreateWindowEx создает окно. Параметры соответственно: расширенный стиль окна; указатель на зарегистрированное имя класса; указатель на имя окна; стандартный стиль окна; X координата левого верхнего угла окна; Y координата левого верхнего угла окна; ширина окна; высота окна; идентификатор родительского окна или окна-владельца; идентификатор меню или дочернего окна; идентификатор исполняемого модуля, с которым связано окно; указатель на значение, которое передается окну через структуру CREATESTRUCT в параметре lParam сообщения WM_CREATE. Возвращаемое значение — идентификатор созданного окна. В случае ошибки возвращается ноль. Названия расширенных стилей окна вы можете найти в файле EQUATES\USER32.INC в группе Extended Window Styles, названия стандартных стилей находятся чуть выше в группах Window Styles и Common Window Styles.

Илон Маск рекомендует:  Связка activex internet explorer

Далее следует цикл msg_loop. Этот цикл будет повторяться до тех пор, пока окно не будет закрыто. Функция GetMessage получает сообщение из очереди сообщений приложения. Если сообщения отсутствуют, функция ожидает их, и цикл приостанавливается до появления нового сообщения. Сообщения посылаются окну операционной системой, когда с окном происходит какое-либо действие — например, когда окно перемещается, изменяется его размер или даже когда курсор мыши просто движется над областью окна. Также окну могут передаваться сообщения от других процессов. Параметры функции следующие: указатель на структуру, в которой разместятся элементы сообщения; идентификатор окна — получателя сообщения: если ноль, то сообщения принимаются для любого окна данного приложения; минимальное значение сообщения; максимальное значение сообщения. Последние два параметра исполняют роль фильтра сообщений. Так как все сообщения являются целочисленными значениями, можно установить фильтрацию типа «от… и до…» Если максимальное и минимальное значения равняются нулю, фильтрация не выполняется, и принимаются все сообщения без исключения. Если функция получает сообщение WM_QUIT (выход), то возвращает ноль. В других случаях eax не будет равен нулю. Следовательно, если eax равен нулю, мы выходим из цикла (je end_loop), иначе цикл продолжается. TranslateMessage переводит комбинации wm_KeyDown/Up в wm_Char или wm_DeadChar, а комбинации wm_SysKeyDown/Up — в wm_SysChar или wm_SysDeadChar — и отправляет переведенное сообщение снова в очередь. Таким образом в процедуру обработки сообщений поступят и виртуальные клавиши и их символьные значения. DispatchMessage передает сообщения процедуре обработки сообщений (WindowProc). В газетной статье нет возможности привести список всех сообщений и их описание, поэтому я рекомендую вам скачать англоязычную справку по API-функциям размером около 22 Мб: сайт . К сожалению, нормального аналогичного справочника на русском языке я вам посоветовать не могу. Так уж сложилось, что не в моде у программистов русский язык.

Процедура обработки сообщений WindowProc вызывается каждый раз при получении окном нового сообщения и передаче его через DispatchMessage. Синтаксис записи этой и других процедур предельно прост: макроинструкция proc, имя процедуры и ее параметры через запятую, которые по умолчанию считаются 32-битными (4 байта каждый). Возврат из процедуры осуществляет команда ret. Каждая процедура должна завершаться инструкцией endp, которая указывает компилятору, где заканчивается код данной процедуры и начинается следующий фрагмент кода. Команда push помещает значение указанного регистра в стек, а команда pop извлекает последнее значение из стека в указанный регистр. Стек — это специально выделенная область памяти для передачи или сохранения данных. Его можно представить, например, как вертикальную штангу тренажера, на которую можно одевать по одному грузу и снимать тоже по одному. Команда push будто указывает, откуда взять груз, а команда pop сообщает, куда поместить груз, снятый со штанги. Такую аналогию я привел для того, чтобы вы уже таки уяснили, что, если мы хотим сохранить содержимое нескольких регистров в стек, а потом вернуть эти значения в регистры, то нам необходимо сохранять в одном порядке, а извлекать — в обратном. Это важно запомнить и не путать: если сохраняем push eax ebx ecx — извлекаем pop ecx ebx eax. А сохраняем мы содержимое этих регистров, чтобы предотвратить потерю данных: функция DefWindowProc спокойно может затереть содержимое этих регистров. Так как окно у нас простейшее, и на нем нет никаких кнопок, кроме крестика для закрытия, единственное сообщение, которое мы должны обработать — это WM_DESTROY, которое будет послано окну перед его удалением. Стало быть, если сообщение равно WM_DESTROY, мы прыгаем на метку .wmdestroy, где будет вызвана функция PostQuitMessage, параметром которой является код завершения. Ноль означает, что программа самостоятельно завершает работу. Эта функция посылает нашему процессу сообщение WM_QUIT, после обработки которого функция GetMessage вернет ноль, и цикл обработки сообщений прервется переходом на end_loop — выход из программы. Если сообщение не WM_DESTROY, то выполняется следующая функция — DefWindowProc. Эта функция обычно вызывается после того, как обработаны все предусмотренные нами сообщения (в нашем случае предусмотрено только одно, но их ведь может быть и сотня), для того, чтобы операционная система своими средствами произвела стандартную обработку сообщения, которое получило наше окно. Параметры функции: идентификатор окна — получателя сообщения; сообщение; дополнительная информация о сообщении; дополнительная информация о сообщении. Что ж, теперь мы можем навесить на наше окно кнопку. Для этого добавим в секцию данных (section ‘.data’) ее класс и имя, а заголовок главного окна немного подправим:

_title db ‘НеПустое Окно’,0
_classb db ‘BUTTON’,0
_textb db ‘КНОПКА’,0

В секцию кода добавим обработку сообщения WM_CREATE, которое приходит окну один раз при его создании, чтобы при создании главного окна создавать дочерние окна. Кнопка — это окно стандартного класса BUTTON, поэтому регистрировать этот класс нам не понадобится. Также добавим обработку сообщения WM_COMMAND, которое приходит окну, когда пользователь выбирает пункт меню или совершает действие с другим дочерним элементом окна (в нашем случае — нажатие на кнопку):

proc WindowProc hwnd,wmsg,wparam,lparam
push ebx esi edi
cmp [wmsg],WM_CREATE
je .wmcreate
cmp [wmsg],WM_COMMAND
je .wmcommand
cmp [wmsg],WM_DESTROY
je .wmdestroy
.defwndproc:
invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
jmp .finish
.wmcreate:
invoke CreateWindowEx,0,_classb,_textb,WS_VISIBLE+WS_CHILD+BS_PUSHBUTTON, 10,10,100,50,[hwnd],1001,[wc.hInstance],NULL

jmp .finish
.wmcommand:
cmp [wparam],1001
jne .finish

invoke MessageBox,[hwnd],_textb,_title,0
jmp .finish
.wmdestroy:
invoke PostQuitMessage,0
mov eax,0
.finish:
pop edi esi ebx

ret
endp

Теперь при создании окна выполнятся команды после метки .wmcreate, и на главном окне будет создана кнопка с идентификатором 1001. При нажатии на эту кнопку окно получает сообщение WM_COMMAND, а wparam сообщения будет содержать в старших двух байтах BN_CLICKED (кликнута кнопка), а в младших двух байтах — идентификатор кнопки (1001). Так как константа BN_CLICKED равна нулю (убеждаемся в этом в EQUATES\USER32.INC), можно не учитывать ее и просто сравнить wparam с 1001, чтобы убедиться, что была нажата наша кнопка. Если не равно — значит, не наша или не нажата — jne .finish . Иначе — показываем мессадж-бокс. По аналогии можете самостоятельно добавить еще пару кнопок, только не забывайте изменять координаты их местоположения, иначе они будут накладываться друг на друга, и вы увидите лишь одну из них. Поэкспериментируйте со стилями и другими параметрами. К следующему занятию постарайтесь четко усвоить принципы создания и работы простых окон, чтобы мы смело могли двигаться дальше.

format PE GUI 4.0


;задание: X=z^3-t^3 Если результат вычитания получится /

;отрицательный, то выдать на экран кроме полученного /

;результата сообщение: «Результат отрицательный».

Test if a directory is writable by a given U > Ask Question

We can test if a directory is writable by the uid of the current process:

But can anyone suggest a way to test if a directory is writable by some other uid?

My scenario is that I am administering a MySQL Server instance, and I want to change the location of the slow-query log file temporarily. I can do this by executing a MySQL command SET GLOBAL slow_query_log_file=’$new_log_filename’ and then disable & enable query logging to make mysqld start using that file.

But I’d like my script to check that the uid of the mysqld process has permissions to create that new log file. So I’d like to do something like (pseudocode):

But of course that’s an imaginary test predicate.

Clarification: I would like a solution that doesn’t rely on su because I can’t assume the user of my script has su privilege.

8 Answers 8

Here’s a long, roundabout way of checking.

That could do the test:

There is only one test (if), no loop and no fork.

+ Nota: as I’v used stat -Lc instead of stat -c , this will work for symlinks too!

So condition is if,

  • I could successfully read stats of $directory and assign them to dirVals ,
  • And (
    • ( Owner match And Flag UserWriteable is present )
    • or flag Other Writeable is present
    • or ( Flag GroupWriteabe is present AND
      • I could successfully assing member list of $wantedUser to gMember AND
      • A string built by merging fields 2 to last of $gMember will match beginOfSting-Or-something-followed-by-a-space, immediately followed by target’s group ( $ ), immediately followed by a-space-followed-by-something-Or-endOfString. )

then echo Happy new year!

As the group’s test implie a second fork (And I love to reduce as possible such calls), this is the last test to be done.

Old:

Nota: Warn to enclose first with double-quotes for having $directory developped!

You can use sudo to execute the test in your script. For instance:

To do this, the user executing the script will need sudo privileges of course.

If you explicitly need the uid instead of the username, you can also use:

In this case, 42 is the uid of the mysql user. Substitute your own value if needed.

UPDATE (to support non-sudo-priviledged users)
To get a bash script to change-users without sudu would be to require the ability to suid («switch user id»). This, as pointed out by this answer, is a security restriction that requires a hack to work around. Check this blog for an example of «how to» work around it (I haven’t tested/tried it, so I can’t confirm it’s success).

My recommendation, if possible, would be to write a script in C that is given permission to suid (try chmod 4755 file-name ). Then, you can call setuid(#) from the C script to set the current user’s id and either continue code-execution from the C application, or have it execute a separate bash script that runs whatever commands you need/want. This is also a pretty hacky method, but as far as non-sudo alternatives it’s probably one of the easiest (in my opinion).

Примеры кода на 39 эзотерических языках программирования

Кто-то ради шутки, кто-то чтобы доказать существование или опровергнуть гипотезу, кто-то для разминки мозгов (путешествуя по поверхности бутылки Клейна или в четырехмерном пространстве), но сотни людей создали «эзотерические» языки программирования. Я пролистал около 150 таких языков и больше никогда не смогу быть прежним.

«Argh!», «Oof!», «2-ill», «Nhohnhehr», «Noit o’ mnain gelb», «DZZZZ», «Ypsilax», «YABALL», fuckfuck — это заклинания, поэзия только названия… под катом — примеры кода на самых вырвиглазных языках программирования.

Кроличья нора глубока.

INTERCAL (тьюринг-полный)

Don Woods и Jim Lyon

Один из старейших эзотерических языков программирования. Как утверждают создатели, его название означает «Язык программирования с непроизносимой аббревиатурой» (англ. Compiler Language With No Pronounceable Acronym). Язык был создан в 1972 году студентами Доном Вудсом (Don Woods) и Джеймсом М. Лайоном (James M. Lyon) как пародия на существующие языки программирования и гимнастика ума.

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

Brainfuck (тьюринг-полный)

Один из известнейших эзотерических языков программирования, придуман Урбаном Мюллером (нем. Urban Müller) в 1993.

Befunge

Стековый эзотерический язык программирования. Считается двумерным, так как программа на Befunge записывается в таблицу со сшитыми краями (тор), по которой в различных направлениях перемещается интерпретатор, исполняя команды, расположенные в её ячейках. Написан Крисом Пресси в 1993 году. Как утверждал автор, его целью было разработать язык, максимально сложный для компиляции. Сложность обеспечивается командами p и g, модифицирующими текст программы.

Malbolge

Язык разработан в с целью быть максимально сложным для написания программ. Получил своё название от Malebolge, восьмого круга ада Данте.

Язык Piet использует разноцветные изображения в качестве программ. Программа на Piet выглядит как постживописная абстракция. Piet получил своё название от имени нидерландского художника Пита Мондриана.

1L_a (expected to be Turing-complete, but this has not been proven)

Программа для печати символа «A»

Оригинал проги слева, справа — укрупненная версия

2L (тьюринг-полный)

Простой цикл, который получает 9 путем умножения 5 на 2 и вычитания 1

В 4DL для представления программы используется четырёхмерная решётка, и направлений её выполнения, соответственно, 8.

Программа, печатающая сумму чисел из входной строки:

Траектория выполнения приведённой выше программы в 4-мерном пространстве:

Aheui

Aheui (아희 на корейском) первый ЯП, который разработан на корейском алфавите Hangul.

BiTrax

Brainloller

Справа — оригинал, слева — увеличенная версия.

DOBELA

DOt-Based Esoteric LAnguage.

Floater

Hexagony

Hexagony — первый язык, где инструкции расположены внутри шестиугольной сетки. Название происходит от слов «hexagon» (шестиугольник) и «agony» (агония), потому что программирование будет сложным.

Язык логических вентелей и цифровых схем.

Manufactoria

Язык и игра в одном лице.

ObjectArt

Sir. Cut

Есть провода, токи, логические вентили и I/O.

SNUSP

Spiral

Spleenmap

Surface

В Surface программные инструкции расположены на 2D сетке вокруг бутылки Клейна.

Zetaplex

Lazy K

Тьюринговая трясина, основанная на комбинаторной логике.

Spoon

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

1111111111001000101111111010111111111101011101010
11011011011000001101011001010010100101011111110
01010001010111001010010110010100110111111111111
1111100101001000101011100101000000000000000000
000101000000000000000000000000000101001010010
10010001010

Velato

Whitespace

Whitespace (англ. пробел) – эзотерический язык программирования, созданный Э. Брэди и К. Моррисом. Существенным его отличием является то, что для управляющих конструкций используются только непечатаемые символы, а именно: пробел, перевод строки и табуляция. Интересным следствием этого факта является то, что текст программы на языке Whitespace можно «скрыть» внутри исходных кодов другой программы.

Hello, world! («Суслика не видно, но он есть»)

Откровенно шуточные ЯП

HQ9+ шуточный язык с четырьмя инструкциями:

H: Print «hello, world»
Q: Print the program’s source code
9: Print the lyrics to «99 Bottles of Beer»
+: Increment the accumulator

LOLCODE

Эзотерический язык программирования, созданный под влиянием интернет-мема о lolcat’ах. Есть спецификация этого языка и существуют несколько работающих интерпретаторов и компиляторов этого языка. LOLCODE является Тьюринг-полным языком.

// «Hello World» by Stephen McGreal.
// Note that the views expressed in this source code do not necessarily coincide with those of the author :o)

Gr34t l33tN3$$?
M3h…
iT 41n’t s0 7rIckY.

l33t sP33k is U8er keWl 4nD eA5y wehn u 7hink 1t tHr0uGh.
1f u w4nn4be UB3R-l33t u d3f1n1t3lY w4nt in 0n a b4d4sS h4xX0r1ng s1tE. ;p
w4r3Z c0ll3cT10n2 r 7eh l3Et3r!

Qu4k3 cL4nS r 7eh bE5t tH1ng 1n teh 3nTIr3 w0rlD.
g4m3s wh3r3 u g3t to 5h00t ppl r 70tAl1_y w1cK1d.
I’M teh fr4GM4stEr aN I’lL t0t41_1Ly wIpE teh phr34k1ng fL00r ***j3d1 5tYlE*** wItH y0uR h1dE. L0L0L0L!
t3lEphR4gG1nG l4m3rs wit mY m8tes r34lLy k1kK$ A$$

l33t hAxX0r$ CrE4t3 u8er- k3wL 5tUff lIkE n34t pR0gR4mm1nG lAnguidGe$…
s0m3tIm3$ teh l4nGu4gES l00k jUst l1k3 rE41_ 0neS 7o mAkE ppl Th1nk th3y’r3 ju$t n0rMal lEE7 5pEEk but th3y’re 5ecRetLy c0dE.
n080DY unDer5tAnD$ l33t SpEaK 4p4rT fr0m j3d1.
50mE kId 0n A me$$4gEb04rD m1ghT 8E a r0xX0r1nG hAxX0r wH0 w4nT2 t0 bR34k 5tuFf, 0r mAyb3 ju5t sh0w 7eh wAy5 l33t ppl cAn 8E m0re lIkE y0d4. hE i5 teh u8ER.
1t m1ght 8E 5omE v1rus 0r a Pl4ySt4tI0n ch34t c0dE.
1t 3v3n MiTe jUs7 s4y «H3LL0 W0RLD. » u ju5t cAn’T gu3s5.
tH3r3’s n3v3r anY p0iNt l00KiNg sC3pT1c4l c0s th4t, be1_1Ev3 iT 0r n0t, 1s whAt th1s 1s.

ArnoldC

Язык программирования терминатора.

То ли язык орангутангов, то ли мечта Вильяма Оккама.

Эзотерический язык программирования, разработанный Дэвидом Морган-Маром, программы на котором сходны с кулинарными рецептами. Каждая программа в языке состоит из названия, списка переменных и их значений, списка инструкций. Переменные могут быть названы только названиями основных продуктов питания. Стек, в которые помещаются значения переменных, называется англ. mixing bowl («чаша для смешивания»), а операции для манипуляции с переменными — mix («смешать»), stir («взболтать») и так далее.

Hello World Souffle.

Ingredients.
72 g haricot beans
101 eggs
108 g lard
111 cups oil
32 zucchinis
119 ml water
114 g red salmon
100 g dijon mustard
33 potatoes

Method.
Put potatoes into the mixing bowl.
Put dijon mustard into the mixing bowl.
Put lard into the mixing bowl.
Put red salmon into the mixing bowl.
Put oil into the mixing bowl.
Put water into the mixing bowl.
Put zucchinis into the mixing bowl.
Put oil into the mixing bowl.
Put lard into the mixing bowl.
Put lard into the mixing bowl.
Put eggs into the mixing bowl.
Put haricot beans into the mixing bowl.
Liquefy contents of the mixing bowl.
Pour contents of the mixing bowl into the baking dish.

Shakespeare

Эзотерический язык программирования разработанный Джоном Аслаудом и Карлом Хассельстромом. Язык Shakespeare призван замаскировать исходный код программы под пьесы Шекспира.

Romeo, a young man with a remarkable patience.
Juliet, a likewise young woman of remarkable grace.
Ophelia, a remarkable woman much in dispute with Hamlet.
Prince Hamlet, the flatterer of Andersen Insulting A/S.

Act I: Hamlet’s insults and flattery.
Scene I: The insulting of Romeo.
[Enter Hamlet and Romeo]
Hamlet:
You lying stupid fatherless big smelly half-witted coward! You are as
stupid as the difference between a handsome rich brave hero and thyself!
Speak your mind!
You are as brave as the sum of your fat little stuffed misused dusty
old rotten codpiece and a beautiful fair warm peaceful sunny summer’s
day. You are as healthy as the difference between the sum of the
sweetest reddest rose and my father and yourself! Speak your mind!
You are as cowardly as the sum of yourself and the difference
between a big mighty proud kingdom and a horse. Speak your mind.
Speak your mind!
[Exit Romeo]
Scene II: The praising of Juliet.
[Enter Juliet]
Hamlet:
Thou art as sweet as the sum of the sum of Romeo and his horse and his
black cat! Speak thy mind!
[Exit Juliet]
Scene III: The praising of Ophelia.
[Enter Ophelia]
Hamlet:
Thou art as lovely as the product of a large rural town and my amazing
bottomless embroidered purse. Speak thy mind!
Thou art as loving as the product of the bluest clearest sweetest sky
and the sum of a squirrel and a white horse. Thou art as beautiful as
the difference between Juliet and thyself. Speak thy mind!
[Exeunt Ophelia and Hamlet]

Act II: Behind Hamlet’s back.
Scene I: Romeo and Juliet’s conversation.
[Enter Romeo and Juliet]
Romeo:
Speak your mind. You are as worried as the sum of yourself and the
difference between my small smooth hamster and my nose. Speak your
mind!
Juliet:
Speak YOUR mind! You are as bad as Hamlet! You are as small as the
difference between the square of the difference between my little pony
and your big hairy hound and the cube of your sorry little
codpiece. Speak your mind!
[Exit Romeo]
Scene II: Juliet and Ophelia’s conversation.
[Enter Ophelia]
Juliet:
Thou art as good as the quotient between Romeo and the sum of a small
furry animal and a leech. Speak your mind!
Ophelia:
Thou art as disgusting as the quotient between Romeo and twice the
difference between a mistletoe and an oozing infected blister! Speak
your mind!
[Exeunt]

OpenSource в заметках

В статье о сигналах мы рассматривали несложный механизм, позволяющий процессам в ОС реагировать на внешние события. Рассматривались способы отправки сигналов процессам при помощи kill, а также обработка поступающих сигналов в сценариях оболочки. Аналогично сигналам, коды возврата позволяют процессам взаимодействовать с вызвавшими их процессами. Эта тема частенько игнорируется пользователями, однако довольно! Сегодня мы поговорим о кодах возврата и работе с ними.

Чем являются коды возврата

Предлагаю начать наше знакомство с простой команды известной практически каждому — mv, которая перемещает файл из одного места файловой системы в другое и, возможно, переименовывает его. Как вы уже, наверное, заметили, при работе mv могут возникать ошибки в случае, если отсутствует исходный файл, или же возникли какие-то другие обстоятельства, помешавшие mv выполнить свою работу. Например:

Вы видите сообщение об ошибке. Очевидно, что команда не сработала. И в то же самое время за кулисами оболочки инициализируется переменная оболочки, содержащая так называемый «код возврата» последней выполненной команды. При желании мы можем получить значение этой переменной. Попробуйте:

Если команда выполняется без ошибок, то обычно её код возврата равен нулю. После выполнения команды оболочка автоматически устанавливает значение переменно $? равным этому коду. Если же команда завершится с ошибкой, то, как правило, её код возврата будет отличным от нуля. В примере выше мы сперва пытаемся переместить несуществующий файл при помощи команды mv. Естественно, мы получаем ошибку, о чём свидетельствует сообщение самой программы, а также код возврата равный единице. Затем мы выполняем команду echo, которая завершается успешно. Её код возврата равен нулю.

Давайте теперь обратимся к info-странице документации программы mv (info coreutils mv). В конце документа есть абзац, говорящий о том, что нулевой код возврата команды означает успешное выполнение, а ненулевой — об ошибке. Небогатый выбор, скажем честно, негде развернуться душе сисадмина!

Вот grep предлагает более широкий выбор средств диагностики результатов своей работы. Фрагмент из документации: «Обычно нулевой код возврата означает, что искомые строки были найдены, и код равный единице в противном случае. Если же при запуске grep использовалась опция -q, —quiet или —silent, строки были найдены, но возникла какая-то ошибка, то возвращается код 2.»

Ниже приведён список определённых системных кодов возврата:

  • 1: общие ошибки;
  • 2: ошибки работы встроенных средств оболочки;
  • 126: невозможно вызвать запрошенную команду;
  • 127: команда не найдена;
  • 128: некорректный аргумент exit;
  • 128 + n: сигнал критической ошибки (например, kill -9 = 137);
  • 130: скрипт прерван по Ctrl+C.

Автор не видел представленного выше списка до тех пор, пока не начал более детально копаться в теме кодов возврата, так что, в принципе, вы можете создавать сценарии вообще не обращая внимание на эту информацию.

Использование кодов возврата

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

Оказывается, есть нюанс при работе с переменной $?, который вызван выполнением команд, вроде echo. Взгляните на результат работы сценария:

Увидели в чём проблема? Код возврата сразу после вызова mkdir равен единице, и это логично, поскольку каталог /usr существует. Но когда мы проверяем значение переменной $? в конструкции if, оказывается, что её значение равно нулю! Почему так? Потому что в этот момент значение переменной $? содержит код возврата предыдущего вызова echo, а не команды mkdir.

Получившуюся проблему можно решить, например, так:

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

Конечно же, обработка ошибок далеко не всегда связана лишь с выводом сообщений и завершением работы сценария. Рассмотрим сценарий, скачивающий файл с нескольких источников до тех пор, пока не будет успешно скачен:

Сокрытие сообщений об ошибках

Теперь, когда вы знаете, как анализировать код возврата программы, вы можете заменять текст сообщений об ошибках программы на свой собственный. Это можно сделать при помощи оператора >&, который перенаправляет стандартный поток вывода и поток ошибок. Например, в нашем первом простом сценарии вывод команды mkdir можно перенаправить таким образом:

Вместо >& можно с тем же успехом использовать &> или 2>&1. Конечно, если вы проверяете код возврата команды, то особого смысла в замене текста сообщений об ошибках нет.

linux — Ошибка Is_writeable, но я владелец

У меня работает приведенный ниже код, и ниже будут указаны значения CHMOD и CHOWN. Но по какой-то причине is_writable продолжает терпеть неудачу.

Значения CHMOD в каталоге — 775, а владелец — User1. Вывод сверху

Единственное, что не соответствует, это владелец/группа файла 111/1, поэтому группы могут отличаться, но владелец идентичен. Почему is_writeable терпит неудачу?

    2 1
  • 15 май 2020 2020-05-15 05:08:33
  • Somk

1 ответ

Вы владелец или веб-сервер?

Все, что вы выполняете с веб- _www должно выполняться как www , _www или www-data (в зависимости от конфигурации, значения по умолчанию для разных ОС). Таким образом, пользователь веб-сервера не входит в вашу группу, что приводит к тому, что файл не может быть записан веб-сервером.

(Ps: get_current_user() — владелец сценария (например, то, что вы установили chown), а не скрипт, выполняющий пользователя. Текущий скрипт, выполняющий пользовательские данные: var_dump(posix_getpwuid(posix_getuid())); )

Илон Маск рекомендует:  Что такое код asp serverstate
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL