Skip to content

Instantly share code, notes, and snippets.

@zamabuvaraeu
Last active January 15, 2026 08:43
Show Gist options
  • Select an option

  • Save zamabuvaraeu/94e1b97f38021d54e03cd13c6e1b86b9 to your computer and use it in GitHub Desktop.

Select an option

Save zamabuvaraeu/94e1b97f38021d54e03cd13c6e1b86b9 to your computer and use it in GitHub Desktop.
Нарушение безопасности: не забывайте обнулять вещи на которые вам наплевать

Не забывайте обнулять вещи, на которые вам наплевать:

Пример 1

Выравнивание полей в структуре может быть причиной раскрытия служебной информации и памяти на машине. Возьмём структуру:

Type FileHeader
	Magic1 As UByte
	Data1 As Long
	Magic2 As UByte
	Data2 As Long
End Type

Dim fh As FileHeader Ptr = Allocate(SizeOf(FileHeader))

' заполняем память контрольным значением
memset(fh, Asc("M"), SizeOf(FileHeader))

' Заполняем структуру
fh->Magic1 = Asc("H")
fh->Data1 = Asc("A")
fh->Magic2 = Asc("h")
fh->Data2 = Asc("a")

В целях оптимизации, компилятор выровнял поля в структуре по границе 4 байт. Посмотрим, что лежит в нашей памяти:

Magic1      Data1       Magic1      Data1     
H  M  M  M  A \0 \0 \0  h  M  M  M  a \0 \0 \0
   ↑                       ↑

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

Пример 2

#include once "windows.bi"

Type FileHeader
	dwMagic As Long
	dwVersion As Long
	szComment As ZString * (255 + 1)
	cbData As Long
End Type

Function SafeToFile( _
		ByVal hFile As HANDLE, _
		ByVal pszComment As ZString Ptr, _
		ByVal cbData As Long, _
		ByVal bData As UByte _
	)As Integer

	Dim fh As FileHeader Ptr = Allocate(SizeOf(FileHeader))

	fh->dwMagic = 16
	fh->dwVersion = 1
	lstrcpyA(@fh->szComment, pszComment)
	fh->cbData = cbData

	Dim cbWritten As DWORD = Any
	WriteFile(hFile, fh, SizeOf(FileHeader), @cbWritten, NULL)
	WriteFile(hFile, @bData, SizeOf(UByte), @cbWritten, NULL)

	Return 0

End Function

Dim hFile As HANDLE = CreateFileA( _
	"file.bin", _
	GENERIC_WRITE, _
	0, _
	NULL, _
	CREATE_ALWAYS, _
	FILE_ATTRIBUTE_NORMAL, _
	NULL _
)

Const Comment = Str("this is a comment")

If hFile <> INVALID_HANDLE_VALUE Then
	SafeToFile( _
		hFile, _
		@Comment, _
		256, _
		1 _
	)
	CloseHandle(hFile)
End If
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment