x86와 x64에서 RTL을 이용한 페이로드 작성 시 주의점

oolongeya

·

2021. 9. 1. 13:48

먼저 x86 방식같은 경우 아래의 게시글과 같이 작성한다.

https://kkomii22.tistory.com/73

 

시스템 해킹을 위한 ret2lib 기법

해당 기법은 Protostar - Stack.5 문제를 기반으로 작성함. 기법을 실습하기 위해 관련 문제 이미지 파일이 필요하다. 해당 파일은 바이러스, 악성코드 파일이 아님을 밝힘. gdb stack5 실행 후 메인 함수

kkomii22.tistory.com

 

위 stack5.py 파일은 32비트 기반의 Protostar 이미지 파일에서 사용한 것이다.

하지만 64비트 기반의 파일의 경우 이야기가 달라진다.

 

그렇다면 어떻게 해야할까?

 

아래의 내용은 Protostar 워게임 stack6 문제를 다룬다.

해당 문제가 64비트 기반의 파일을 공격하는 방법에 대해서 이해하기 적절하다.

https://kkomii22.tistory.com/74?category=970038 

 

Protostar - Stack 6 (쉘 코드 + 버퍼 오버플로우 + ret2lib)

Stack6.c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #include #include #include #include void getpath() {   char buffer[64];   unsigned int ret;   prin..

kkomii22.tistory.com

 

우선 RTL(Return to Library) 기법은 NX bit라는 메모리 보호 기법을 우회하기 위한 공격이다.

NX bit는 스택영역에 쉘 코드를 삽입해서 이 쉘 코드를 실행할 수 없도록 스택 상의 실행 권한을 제거해서 프로세스 명령어나 데이터 저장을 위한 메모리 영역을 분리 시키는 기술이다.

 

RTL(Return to Library) 기법은 x86, 64 각각 다른 비트수에서 다른 방식으로 페이로드를 짜야한다.

각 비트별 함수 호출 규약을 살펴봐야 한다는 것이다.

 

x86에서는 cdecl 방식을 규약으로 사용한다. 

1 2 3 4 순서대로 작성해서 컴파일을 한다면, push를 이용해서 스택에 0x4, 0x3, 0x2, 0x1로 집어 넣는다.

x64에서는 fastcall 방식을 규약으로 사용한다.

1 2 3 4 순서대로 작성해서 컴파일을 한다면, 레지스터(rdi, rsi, rdx, rcx, r8, r9)를 이용한다.

rdi(1), rsi(2), rdx(3), rcx(4) 를 이용해서 인자를 전달한다.

 

즉 함수 호출 규약에서의 차이가 존재하기 때문에 페이로드도 달라지는데,

 

x86 방식에서 페이로드는 스택에서 첫번째로 꺼내야 하는 인자값이 ret에 들어가는 것이다.

 

(패딩) + ret(system 함수의 주소) + 더미(system 함수의 ret값을 더미로 덮음) + system 함수의 인자(/bin/sh 의 주소) 방식으로 페이로드를 작성한다.

 

x64 방식에서는 ret에 "pop rdi, ret" 코드가 저장된 주소값이 들어가야 한다.

ropsearch 'pop rdi; ret' 으로 코드의 주소를 확인할 수 있다. (0x0040125b)

 

(패딩) + ret("pop rdi, ret" 코드 주소) + 레지스터 인자값("/bin/sh") + system 함수의 주소 방식으로

페이로드를 작성해야 한다.

 

위와 같은 페이로드를 작성해서 공격파일을 만들겠다.

 

성공적으로 쉘을 얻을 수 있다.

 

이처럼 x86과 x64 기반의 파일들을 페이로드 작성에 차이가 있다.

반응형