C언어로 작성된 printf함수 분석해보기
작성한 C프로그램은 아래와 같다.
#include <stdio.h>
int main() {
printf("hellow");
return 0;
}
x64dbg와 IDA를 활용해서 분석해보겠다.
printf함수를 통해 "hellow"문자열을 어떻게 출력하는지 확인해보려고 함수를 계속해서 들어갔더니 syscall(시스템 콜인듯하다.)(syscall함수는 인자를 받지 않고 레지스터의 값들을 통해 실행된다.)
syscall함수 뒤에 아무런 인자도 없는데 실행하면 "hellow"문자열을 출력하는게 궁금해서 자세히 알아보겠다.
https://j00ru.vexillium.org/syscalls/nt/64/
위 사이트를 들어가보면 windows system call symbol의 아래에는 API함수?들이 정의 되어 있고 오른쪽에는 각 운영체제 별로 해당 API함수들이 가르키는 값이 들어있는 것 같다. NtWriteFile함수를 가르키는 값은 0x0008이고 아래 사진을 보면
NtWriteFile 시스템 호출을 사용하기 위해서 mov eax,8을 통해 eax레지스터에 0x0008값을 넣어준다. syscall을 했을 때 "hellow"문자열을 어디서 받아서 실행했는지도 알아보겠다. mov r10, rcx는 파일 핸들을 레지스터로 복사하는 작업이다. 원래 r10에 "hellow"문자열을 저장하는 주소값이 들어있지만 파일핸들을 덮어씌운다. 어떤 방식으로 문자열을 출력할 수 있는지는 잘 모르겠다..
x64dbg를 사용할 때 시스템 중단점의 체크를 해제하고 진입점 중단점만 체크하는데 시스템 중단점을 체크하고 프로그램이 시작되기 전에 어떤 과정이 들어가나 살펴보겠다. 근데 이전에 운영체제에서 프로세스를 실행할 때 어떤 절차를 거치는지 이론적으로 공부하고 가는게 좋을 것 같아서 이론부터 공부해야겠다. (지쳐서 다음에 공부하기로..)