Exercise
•
일반적으로 main함수는 C계열 언어에서 프로그래머가 작성한 코드 중 가장 먼저 실행되는 함수입니다.
•
그래서 리버싱을 처음 공부할 때는 프로그램에서 가장 먼저 실행되는 코드가 main함수의 코드라고 생각하기 쉽습니다.
•
그러나 사실 운영체제는 바이너리를 실행할 때, 바이너리에 명시된 진입점부터 프로그램을 실행합니다.
•
진입점이 main함수인게 불가능한 것은 아니지만, 일반적으로는 그렇지 않습니다.
•
진입점과 main함수의 사이를 채우는 것은 컴파일러의 몫입니다.
•
대부분의 컴파일러는 둘 사이에 여러 함수를 삽입하여 바이너리가 실행될 환경을 먼저 구성하고, 그 뒤에main함수가 호출되게 합니다.
•
잠시 편의상 진입점에 위치한 함수를 start함수라고 하겠습니다.
•
main함수를 쉽게 찾고 싶다면, 컴파일러가 작성하는 start함수에 익숙해져야 합니다.
•
start함수를 여러 번 분석하다 보면 나중에는 start함수를 보고, main함수가 어디서 호출될지를 쉽게 찾아낼 수 있습니다.
•
이 코스에서 start함수를 직접 분석하지는 않지만, 스스로 분석해보시는 것을 추천해 드립니다.
•
스트림 (Stream)은 데이터가 조금씩 흘러들어온다는 의미에서 명명되었습니다.
•
데이터는 스트림의 형식으로 한 프로세스에서 다른 프로세스로, 또는 한 프로세스에서 다른 파일 등으로 이동합니다.
•
운영체제는 stdin (standard input), stdout (standard output), stderr (standard error) 와 같은 기본 스트림들을 프로세스마다 생성해줍니다.
•
이들은 일반적으로 사용자와 프로세스를 연결해주기 위해 사용됩니다.
•
printf 함수는 stdout 을 통해 출력 데이터를 우리가 볼 수 있게 해주며, scanf 함수는 우리의 키보드 입력을 stdin으로 받아서 프로세스에 전달해 줍니다.
•
이런 기본 스트림외에, 프로그래머는 필요에 따라 스트림을 생성할 수도 있습니다.
•
예를 들어, 프로그래머가 dream.txt 라는 텍스트파일에 데이터를 저장하고 싶다면, 이 파일과 스트림을 형성하여 내용을 작성할 수 있습니다