실습 OS) Ubuntu 22.04
실습 Architecture) Intel x86-64
source code) https://github.com/praivesi/dreamhack/tree/main/shellcode
Dreamhack 강의 중 Assembly code 를 skeleton 코드에 삽입하여 실행해보는 예제를 실습했다.
이 실습의 목적은 어셈블리 코드의 수행 과정을 pwndbg 로 따라가면서 레지스트리와 메모리가 어떻게 바뀌는지 확인해보는 과정이었다.
어셈블리 코드 중간에 syscall 을 호출하는 과정이 있는데,
이 함수에 파라미터를 전달하려면 registry 의 RAX, RSI, RDX 값 등을 바꿔주어야 한다.
마찬가지로 함수의 리턴 결과를 받을 때에도 이러한 registry 필드에 씌여진 값을 읽으면 된다.
SYS_OPEN 을 호출하기 위해 RAX 값을 2 (syscall_open)로 설정한 후 syscall 을 실행했다.
정상적인 경우라면 파일을 OPEN했기 때문에 파일 디스크립터 값이 (예를 들면 3) RAX에 저장되어 있어야 한다.
그런데 음수값인 -2(0xffff~e)가 저장되어 있었다.
내 시스템이 실습에서 사용하는 시스템과 다른게 문제인가 싶어서 GPT한테 물어보니
정상적인 경우 양수값인 파일 디스크립터 값이 RAX에 적히고,
함수 호출에 오류가 발생한 경우 오류 넘버가 RAX에 적힌다는 것이었다.
-2 가 뜻하는 바는 'No file or directory exists' 였다.
아,, 생각해보니 환경을 재구축하는 과정에서 open의 대상이 되는 파일을 만들지 않았었다.
파일을 만들고 다시 실행하니 정상적으로 RAX에 양수값인 파일 디스크립터가 적혀 있었다.