본문 바로가기

Study/Dreamhack - System Hacking

orw 실습

 

실습 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에 양수값인 파일 디스크립터가 적혀 있었다.

 

SYS_open 호출 직후 RAX 레지스트리에 양수값이 아닌 음수값이 적혀있는 모습

 

반응형