(c->assembly)[2]

ucf·2020년 9월 30일
0

리버싱창고

목록 보기
2/3

지난번에는 printf를 메인으로 코드를 살펴보았다.
이번에는 scanf를 살펴볼 예정이다.

c언어 코드는 다음과같다

int형변수 a를 생성해준후 scanf를 통해서 a의값(정수)를 입력받았다.

radare2로 메인함수를 찾은 결과이다.
이전 printf예제와 c코드의 길이는 별반 차이가 없음에도불구하고 어셈코드는 상당히 많이 늘어났다. 때문에 한줄한줄 살펴보기보단 모르는 어셈명령위주로 우선 공부해보자.

sub -> 첫번째값 -= 두번째값 (add는 sub와같은구조에서 + 연산)
xor -> 논리연산에서의 Exclusive OR이다. 각 비트가 서로 다른값일때만 결과가 1이다.
je -> 두 값을 비교했을때 값이 같으면 원하는 레이블로 점프하는 명령어
leave -> mov esp, ebp => pop ebp //ebp의 주소값을 esp로 복사하고 스택의 제일 위에있는 내용을 ebp에 넣고 return 한다.

모르는 주요 명령어들을 정리해 보았다.

이후 어셈블리를 다시 보려고 했더니 맨 위에 정수형 변수 2개가 생성된것을 볼 수 있다. int형 변수 a를 c로 생성한게 원인이라 생각했지만 여기서는 왜 2개가 있는지 이해가 되지않아 우선 c코드로 변수 1개를 만들고 어셈블리 코드를 살펴보았다.

--정수 한개만 사용하였을 때는 아까와는다르게 어셈블리코드에서 변수를 찾아볼 수 없다.

때문에 위의 코드에서 printf 함수로 변수를 출력하는 구문을 한줄 추가하고 다시 디스어셈 해보았다.

변수가 추가된 모습을 볼 수 있다. 이를통해서 변수를 생성한 후 사용해야 어셈블리에서도 변수가 생성된 사실을 알게되었다.

그렇다면 printf나 scanf같은 함수를 사용해야만 변수가 생성되는걸까?
사진은 첨부하지 않았지만 변수를 단순히 초기화만 해주었을때도 위와같은 결과가 나타났다. 심지어 rbp-0x4 라는 부분도 완전히 똑같았다.

char형과 float 형으로도 시도를 해보았더니 각각 rbp-0x1, rbp-0x4가 나오는것을 확인하였다. 확인해봤더니 이는 rbp에서 0xc를 뺀곳(주소)에 local_ch를 위치시킨다는 의미였다.
또한 어셈에서의 변수의 자료형은 항상 int였고 이름의형식은 'local_(자료형크기)h' 였다.

그렇다면 scanf를 사용할 때 생성되는, 우리가 생성한 변수 이외의 또다른 변수는 무엇일까?
scanf를 사용할 때만 생성되는걸로봐서는 우리가 입력하는 버퍼의 공간이라고 추측할 수 있다.
%d와%f, 그리고 %c의 경우에 변수의 크기가 다르게 생성되었다.

char = 0x9
int = 0xc
float = 0xc

변수를 생성할때 봤듯이 int와 float의 크기는 똑같았다. 때문에 이번에도 int와 float은 scanf를 사용할때 생성되는 변수의 크기도 같았다.
확인해봤더니 scanf를 사용할 때 사용할 공간을 할당하는 것이었다. rbp에서 특정 값을 뺀 후 그 값에 해당하는 주소에 값을 저장하는 방식이다.

==

공부하다보니 컴퓨터구조와 c의 메모리와 관련된 부분에서 부족한 부분이 너무 많다는걸 느꼈다.
우선 컴퓨터구조와 c를 좀더 학습한 후에 다시 이어가봐야겠다.

profile
즐기자!

0개의 댓글