오늘 언더플로우가 어떻게 일어나는지 살펴 보았다.
먼저 소스 예제는 이렇다.
//gcc -o underflow underflow.c
#include "stdio.h"
#include <limits.h>
int main() {
char a = CHAR_MIN;
a -= 1;
printf("%d", a);
}
이렇게 되어 있으며 CHAR_MIN은 실질적으로 -128이라는 값을 얻는다.
그리고 보통 실행 결과는 이렇다.
-128이라는 값이 -1를 통해 127로 변했다. 그 원리는 아래의 링크를 참고
https://noobhack.tistory.com/66
[NOOBHACK] 언더플로우??
오늘은 언더플로우에 대해 알아보자 오버플로우와 같은 원리로 발생하는 취약점인데 한 변수가 담을 수 있는 수의 크기를 넘어서면 모든 비트가 초기화 되면서 최소값으로 다시 시작하는 것이
noobhack.tistory.com
그리고 이 과정을 GDB로 관찰해 보자
어셈블리어 코드이다. 혹시나 어셈블리어를 모르는 분들을 위해 링크를 더 올려놨다.
https://noobhack.tistory.com/search/%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC%EC%96%B4
NOOBHACK
제가 초짜입니다
noobhack.tistory.com
그리고 관찰을 위해 브레이크 포인트 까지 걸어놓았다.
이렇게 실행을 하고 나면
프로세스가 실행이 되면서 브레이크 포인트에서 작동이 멈추고 현재 메모리 정보를 알려준다.
그리고 RAX라는 레지스터에 -128이라는 변수 a의 값이 옮겨져 있다
그리고 이것은 -128이지만 2진수로 표현하자면
10000000
이런 상태이다. 즉, 음수의 표현법은 맨 앞의 숫자가 1은 음수이며 0은 양수이므로 음수라는 의미다 그리고 음수는 1은 0 으로 표현 되므로 한 char 변수가 담을 수 있는 음수의 끝까지 갔다는 의미이다.
여기서 -1를 더 한다면
RAX의 레지스터의 값이 0x7f가 된 것을 볼 수 있다. 이걸 다시 2진수로 표현하자면
01111111
이는 앞의 숫자가 0이므로 양수를 의미하며 모든 숫자가 채워져 있다. 양수 127를 의미한다.
하지만 메모리는 양수와 음수를 구분하며 데이터를 저장하지 않는다.
프로그래밍 언어와 컴파일러의 해석에 따라 달라지므로 현재 RAX 레지스터의 값을 양수 127로 해석한다.
다르게 생각한다면 메모리의 담겨진 데이터는 컴파일러의 해석에 따라 달라진다.
0x7f가 양수 127인지 음수 -127인지는 컴파일러가 알아서 해석하기 나름이다.
'컴퓨터' 카테고리의 다른 글
[NOOBHACK] cmd 사용 방법 (0) | 2023.10.27 |
---|---|
[NOOBHACK] C언어에서 기계어 변환 과정 (0) | 2023.09.13 |
[NOOBHACK] GPU의 원리 (1) | 2022.10.18 |
[NOOBHACK] CPU의 작동 원리 (1) | 2022.10.17 |