Search

6장 : Basic Exercise

대분류
보안
소분류
기초 리버싱
유형
Exercise
최종 편집 일시
2024/11/02 10:24
생성 일시
2022/10/18 02:23
15 more properties

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 라는 텍스트파일에 데이터를 저장하고 싶다면, 이 파일과 스트림을 형성하여 내용을 작성할 수 있습니다