Layer7 - 리버싱 2차시 과제
자주 쓰는 리눅스 명령어
리눅스에는 수많은 명령어가 있는데 나는 리눅스를 해킹용으로 써서 자주 사용하는 명령어들은 그닥 많지 않다. 내가 자주 쓰는 명령어 위주로 정리해보면
ls : 현재 디렉토리에 존재하는 파일을 보여준다.
ls -al : ls에 -al옵션을 붙이면 파일 권한이나 숨김파일까지 싹 다 보여준다. 은근 -al옵션이 필요할때가 많다.
cd : 디렉토리를 이동할때 쓴다.
mv : 파일을 옮길때 쓴다. 근데 파일 옮기는것보다 파일 이름바꿀때 더 많이 쓰는것 같다.
cp : 파일을 복사할때 쓴다. 포너블 할때는 libc를 공유폴더로 빼올때 가장 많이 쓰는것 같다.
mkdir : 새 디렉토리 만들때 쓴다. v8이나 커널같이 무언가 빌드할때 새 디렉토리 파고 그 안에서 한다.
id : 현재 유저의 이름과 uid, gid등 유저의 정보를 보여준다. exploit하고 셸 잘 따였는지 확인할때 가장 먼저 쳐보는 명령어이다.
pwd : 현재 디렉토리 경로를 보여준다. 환경변수 설정 등의 이유로 현재 디렉토리의 절대경로를 알아야 할때나 exploit해서 셸 딴 후에 현재 어느 디렉토리에 있는지 확인할때 등 은근히 많이 쓰이는 명령어이다.
cat : 파일 읽을때 쓰는 명령어이다. exploit하고 flag읽을때 가장 많이 쓰고 가끔 이전에 작성했던 코드 보고싶은데 에디터 키기 귀찮을때 쓴다.
Vim 사용법
vim은 vi를 개조한(?) 에디터이며 Windows 8.1데스크탑을 쓰던 시절에 Docker와 wsl2를 못써서 울며 겨자먹기로 vmware를 쓰면서 어쩔 수 없이 많이 쓰게 된 에디터이다. 지금은 모든 코드는 VSC로 짠다. 암튼 vim에는 명령어 모드와 편집 모드 2가지가 있는데 처음 키면 명령어 모드가 되고 i나 e키를 눌러서 편집 모드로 바꿀 수 있다. 커서가 떨어지는 위치에 약간의 차이가 있지만 i나 e나 거의 비슷하니 더이상의 언급은 생략하겠다.
편집 모드에서는 그냥 키보드 눌러서 글씨 쓰고 방향키로 커서 이동하면서 편집하면 되고 명령어 모드에서는 콜론 치고 원하는 명령어 쳐주면 된다.
:w 파일을 저장한다.
:q 에디터를 나간다.
:q! 저장하지 않은게 있어도 무시하고 에디터를 나간다.
:wq 저장하고 에디터 나간다.
이거 외에도 다른 명령어도 많고 편집 모드에서도 뭐가 많은데 노트북 사기 전에 1년동안 vim으로 코딩하고 익스짜면서 :wq말곤 거의 아무것도 안쓴것 같다. :wq만 있으면 vim은 무리없이 쓸 수 있다. 만세!!
정적 분석과 동적 분석
정적 분석은 IDA와 같은 도구로 프로그램을 실행하지 않고 Pseudo code나 어셈블리어를 보고 프로그램을 분석하는 행위이다.
동적 분석은 프로그램을 직접 실행하면서 레지스터와 메모리의 변화를 같이 보면서 분석하는 행위 이다.

정적 분석은 위와 같이 분석하는 것이고

동적 분석은 위와 같이 분석하는 것이다.
사실 IDA에서 동적 분석도 되는데 2년동안 gdb만 써서 동적 분석 했다. 조만간 IDA동적 분석 방법도 배워야겠다.
컴파일 과정
전처리 -> 컴파일 -> 어셈블 -> 링킹 4가지 과정을 거친다. 먼저 test.c파일을 하나 만들고 컴파일 과정을 살펴보겠다.

C언어 파일을 하나 만들고 컴파일 과정의 모든 로그가 남도록 gcc에 --save-temps옵션을 줘서 컴파일한다.


보면 컴파일 과정의 여러 파일들이 생긴걸 볼 수 있다. 먼저 test.i파일을 열어보면

전처리를 거친 후의 소스코드가 나온다. 주석을 제거하고 매크로를 치환, 적용하는 등 전처리 과정을 거친 후의 결과물이다.

그리고 이제 컴파일을 해서 어셈블리어로 변환한다.

변환된 어셈블리어를 어셈블러를 이용해서 목적 코드로 변환을 한다.

마지막으로 링킹 과정을 거쳐서 바이너리를 만들어낸다. 밑에 보면 목적 코드에는 없던 링킹된 libc관련 내용들이 보이는걸 알 수 있다.
사실 test.s부터는 우리가 직접 어셈블리어로 코딩하고 컴파일하는 과정인 nasm -o test.o test.s해서 어셈블하고 ld -o test test.o해서 링킹하는것과 같은 과정이다.