Integer Overflow
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
정수 오버플로우의 핵심은 컴퓨터 프로그래밍에서 데이터 유형의 크기에 의해 부과된 제한과 데이터의 해석입니다.
예를 들어, 8비트 부호 없는 정수는 0에서 255까지의 값을 나타낼 수 있습니다. 8비트 부호 없는 정수에 256의 값을 저장하려고 하면, 저장 용량의 제한으로 인해 0으로 돌아갑니다. 마찬가지로, 0에서 65,535까지의 값을 저장할 수 있는 16비트 부호 없는 정수에 65,535에 1을 더하면 값이 다시 0으로 돌아갑니다.
또한, 8비트 부호 있는 정수는 -128에서 127까지의 값을 나타낼 수 있습니다. 이는 한 비트가 부호(양수 또는 음수)를 나타내는 데 사용되므로, 7비트가 크기를 나타내는 데 남습니다. 가장 작은 음수는 -128(이진 10000000
)로 표현되고, 가장 큰 양수는 127(이진 01111111
)로 표현됩니다.
잠재적인 웹 취약점에 대해 최대 지원 값을 아는 것은 매우 흥미롭습니다:
출력된 결과는 0이 될 것입니다. 왜냐하면 우리는 char를 오버플로우했기 때문입니다:
사용자 입력에서 읽은 signed 정수가 적절한 검증 없이 unsigned 정수로 취급되는 상황을 고려해 보십시오:
이 예제에서 사용자가 음수를 입력하면 이진 값이 해석되는 방식 때문에 큰 부호 없는 정수로 해석되어 예기치 않은 동작을 초래할 수 있습니다.
비밀번호의 크기를 저장하는 데 1B만 사용되므로 이를 오버플로우하여 실제 길이가 260인 반면 길이가 4인 것처럼 인식하게 할 수 있습니다.
몇 개의 숫자가 주어졌을 때 z3를 사용하여 첫 번째 숫자와 곱해져 두 번째 숫자를 생성하는 새로운 숫자를 찾습니다:
비밀번호의 크기를 저장하는 데 1B만 사용되므로 이를 오버플로우하여 실제 길이가 260인 반면 길이가 4인 것처럼 인식하게 하여 길이 검사 보호를 우회하고 스택에서 다음 지역 변수를 덮어쓰고 두 가지 보호를 모두 우회할 수 있습니다.
이 ARM64에서는 변경되지 않습니다. 이 블로그 게시물에서 확인할 수 있습니다.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)