앞서 리눅스 환경에서 다운로드 받은 파일의 압축을 해제하였다.
checksec --file rao 명령어를 통해서 rao 파일에 보호기법이 걸려있는지 확인하였다.
rao 파일에 보호기법이 걸려있지 않음을 확인하였고, rao파일을 실행시켰다.
데이터를 대량으로 입력하면 버퍼 오버플로우가 발생한다는 것을 알게 되었다.
다음으로 rao.c 파일의 소스 코드를 확인하였다.

- main함수에서 buffer의 크기는 0x28, 즉 40B 임을 알 수 있다.
- scanf()로 입력 받았으므로 입력값 길이는 검증이 안 된 상태여서 버퍼 오버플로우가 발생할 수 있다.
- get_shell() 함수는 execve() 함수를 통해 /bin/sh을 실행한다는 것을 알 수 있고, 이를 통해 셸을 획득할 수 있다.
- 스택 버퍼 오버 플로우 취약점이 발생해서 -> return address를 get_shell()로 덮어써야 함 -> 셸 획득 가능
이런 상황임을 알 수 있다.


dissemble main을 통해서 main() 함수의 어셈블리 코드를 확인하였다.
1) 현재 함수의 rbp(base pointer)를 스택에 저장
2) rbp에 현재의 스택 포인터(rsp)를 저장
3) rsp에서 0x30만큼 지역 변수를 위한 스택 공간을 할당
(앞서 buffer는 0x28라고 주어졌는데 여기에서는 스택 포인터가 16B 정렬이 되야 하니까 48B로 할당됨)
4) eax 값을 0으로 초기화
5) init 함수 호출
6) rdi 레지스터에 "Input: "문자열 할당
7) eax를 0으로 초기화하여 printf 함수의 리턴값을 설정
8) printf 함수 호출
9) rax에 rbp-0x30만큼 떨어진 위치의 주소 저장
10) rsi에 rax 값 복사
11) rdi에 "%s" 문자열 포맷 주소 저장
12) eax를 0으로 초기화
13) scanf() 함수 호출
14) eax를 0으로 초기화
15) 스택 프레임 해제
16) 함수 종료

0x30 + 0x8 만큼 덮어서 버퍼 오버플로우 공격을 하였다.
(왜냐하면 rbp의 크기는 8B이기 때문이다.)
또한 RET을 get_shell()의 주소값으로 덮어 /bin/sh를 실행시켰다.
gdb에서 print get_shell를 통해서 주소값을 구했다.
