Reverse Engineering

Reverse Engineering software λ₯Ό λΆ„μ„ν•˜μ—¬ μ†ŒμŠ€μ½”λ“œλ₯Ό μ—­μœΌλ‘œ 생성 ν•΄ λ‚΄λŠ” 기법 software 뢄석 방법 Static analysis ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚€μ§€ μ•Šκ³  μˆ˜ν–‰ν•˜λŠ” 뢄석이닀. ν”„λ‘œκ·Έλž¨μ˜ 전체 ꡬ쑰λ₯Ό νŒŒμ•…ν•˜κΈ° μ‰¬μš°λ©°, ν™˜κ²½μ  μ œμ•½ 사항에 자유둭고, μ•…μ„± μ½”λ“œμ˜ μœ„ν˜‘μœΌλ‘œλΆ€ν„° μ•ˆμ „ν•˜λ‹€. λ‚œλ…ν™” μ μš©μ‹œ 뢄석이 μ–΄λ €μ›Œ μ§„λ‹€λŠ” 단점이 μžˆλ‹€. 정적뢄석에 μ‚¬μš©λ˜λŠ” νˆ΄λ‘œλŠ” IDA κ°€ μžˆλ‹€. IDA λŠ” ν”„λ¦¬μ›¨μ–΄λ‘œ https://hex-rays.com/ida-free/ μ—μ„œ λ‹€μš΄ κ°€λŠ₯ν•˜λ‹€. Dynamic analysis ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚€λ©° μˆ˜ν–‰ν•˜λŠ” 뢄석이닀. ν”„λ‘œκ·Έλž¨μ˜ 개랡적인 λ™μž‘μ„ λΉ λ₯΄κ²Œ 확인 ν•  수 μžˆλ‹€. 정적 뢄석과 λ°˜λŒ€λ‘œ ν”„λ‘œκ·Έλž¨ 싀행에 ν•„μš”ν•œ ν™˜κ²½ ꡬ성이 μ–΄λ €μšΈ 수 μžˆλ‹€. μ•ˆν‹° 디버깅 기법 적용된 ν”„λ‘œκ·Έλž¨μ€ 디버깅이 λΆˆκ°€λŠ₯ν•˜λ‹€. IDA λ¦¬λ²„μŠ€ μ—”μ§€λ‹ˆμ–΄λ§ 툴 단좕어 shift + F12 λ¬Έμžμ—΄ 검색, String νƒ­μœΌλ‘œ 이동 x μƒν˜Έμ°Έμ‘° 확인, λ³€μˆ˜ λ˜λŠ” ν•¨μˆ˜κ°€ μ‚¬μš©λ˜λŠ” 곳의 μœ„μΉ˜λ₯Ό 확인 F5 μ–΄μ…ˆλΈ”λ¦¬λ₯Ό C μ–Έμ–΄ ν˜•νƒœλ‘œ λ³€ν™˜ g νŠΉμ • μ£Όμ†Œ ν˜Ήμ€ 라인으둜 이동 λ””μ»΄νŒŒμΌ 된 ν•¨μˆ˜ 이름 μœ„μ— μ»€μ„œλ₯Ό 놓고 g λ₯Ό λˆ„λ₯΄λ©΄ μ–΄μ…ˆλΈ”λ¦¬ 상 ν•¨μˆ˜ 라인을 확인할 수 μžˆλ‹€. ν•¨μˆ˜ 이름을 적어도 ν•¨μˆ˜ μœ„μΉ˜λ‘œ μ΄λ™λœλ‹€. ESC 이전 μ»€μ„œ μœ„μΉ˜λ‘œ 이동 Ctrl + Enter λ‹€μŒ μ»€μ„œ μœ„μΉ˜λ‘œ 이동 n λ³€μˆ˜ 이름 λ°”κΎΈκΈ° Y λ³€μˆ˜ νƒ€μž… μ„€μ • ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜ λ³€κ²½, ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜ νƒ€μž… λ³€κ²½ F2 μ–΄μ…ˆλΈ”λ¦¬ ν˜Ήμ€ C μ–Έμ–΄ λΌμΈμ—μ„œλŠ” break point(쀑단점) μ„€μ • stack λ˜λŠ” hex View μ—μ„œλŠ” κ°’ λ³€κ²½ F9 μ‹€ν–‰ (run) ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œμΌœ 동적 뢄석을 μˆ˜ν–‰ν•  수 μžˆλ‹€. F8 ν•œ 단계 μ‹€ν–‰ (next) F7 ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ§„μž… (step int) Ctrl + F2 디버깅 쀑단 r hex 데이터λ₯Ό 문자둜 λ³€ν™˜ Shift + E μ„ νƒν•œ 값을 μ›ν•˜λŠ” ν˜•νƒœλ‘œ λ³€ν™˜ν•˜μ—¬ μΆ”μΆœ(export) hex 데이터λ₯Ό λ¬Έμžμ—΄λ‘œ μΆ”μΆœν•  λ•Œ μœ μš©ν•˜λ‹€. ν™”λ©΄ IDA View ...

<span title='2024-05-12 14:42:07 +0900 KST'>May 12, 2024</span>&nbsp;Β·&nbsp;5 min&nbsp;Β·&nbsp;AswinBlue

Exploit

Exploit pwntool의 checksec λͺ…λ Ήμ–΄λ‘œ μ–΄λ–€ λ³΄μ•ˆμ΄ μ μš©λ˜μ—ˆλŠ”μ§€ 확인 κ°€λŠ₯ν•˜λ‹€. Shell Code exploit은 파일 읽고 μ“°κΈ°(open-read-write, orw), μ…Έ λͺ…λ Ή μ‹€ν–‰(execve) κΆŒν•œμ„ μ·¨λ“ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•œλ‹€. Shell κΆŒν•œμ„ νšλ“ν•˜κΈ° μœ„ν•œ μ–΄μ…ˆλΈ”λ¦¬ μ½”λ“œλ“€μ˜ λͺ¨μŒμ„ β€˜Shell Code’ 라 μΉ­ν•œλ‹€. ν™˜κ²½μ„ΈνŒ… pwntools checksec shellcraft ROPgadget one_gadget patchelf 취약점 곡격 μˆœμ„œ λ°”μ΄λ„ˆλ¦¬λ₯Ό λΆ„μ„ν•˜μ—¬ λ³΄ν˜ΈκΈ°λ²•μ„ ν™•μΈν•œλ‹€. checksec λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°”μ΄λ„ˆλ¦¬μ— 적용된 λ³΄ν˜ΈκΈ°λ²•μ„ ν™•μΈν•˜κ³ , 적용 λΆˆκ°€λŠ₯ν•œ exploit 기법을 μΆ”λ €λ‚Έλ‹€. checksec μ°Έμ‘° ldd λͺ…령을 ν™œμš©ν•˜μ—¬ μ˜μ‘΄μ„± 관계λ₯Ό ν™•μΈν•œλ‹€. ldd λͺ…λ Ή μ½”λ“œλ₯Ό ν™•μΈν•˜μ—¬ 취약점 및 ꡬ쑰(stack ν˜•νƒœ)을 νŒŒμ•…ν•œλ‹€ stack은 ν•¨μˆ˜μ—μ„œ μ„ μ–Έλœ μˆœμ„œλŒ€λ‘œ ν• λ‹Ήλ˜μ§€ μ•ŠμŒμ— μ£Όμ˜ν•˜λ©°, 무쑰건 assemblyμ–΄λ₯Ό 톡해 stack μ£Όμ†Œμ—μ„œ νŠΉμ • λ³€μˆ˜μ˜ μœ„μΉ˜λ₯Ό ν™•μΈν•˜λ„λ‘ ν•œλ‹€. ...

<span title='2024-03-11 20:46:33 +0900 KST'>March 11, 2024</span>&nbsp;Β·&nbsp;67 min&nbsp;Β·&nbsp;AswinBlue

Pwntool

pwntool μ‹œμŠ€ν…œ 해킹을 μœ„ν•΄ μ œμž‘λœ 파이썬 라이브러리 λ°”μ΄λ„ˆλ¦¬λ₯Ό μ‹€ν–‰ν•˜κ³  νŠΉμ • input을 μ§‘μ–΄λ„£μ–΄ ν•΄ν‚Ή(exploit)을 ν• μˆ˜ 있게 ν•œλ‹€. μ„€μΉ˜ λ¦¬λˆ…μŠ€μ˜ apt와 파이썬의 pip λͺ…λ ΉμœΌλ‘œ μ„€μΉ˜κ°€ κ°€λŠ₯ν•˜λ‹€. $ apt-get install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential $ python3 -m pip install --upgrade pip $ python3 -m pip install --upgrade pwntools 곡식 메뉴얼 dockerλ₯Ό μ‚¬μš©ν•œ μ„€μΉ˜ 방법 FROM ubuntu:18.04 ENV PATH="${PATH}:/usr/local/lib/python3.6/dist-packages/bin" ENV LC_CTYPE=C.UTF-8 RUN apt update RUN apt install -y \ gcc \ git \ python3 \ python3-pip \ ruby \ sudo \ tmux \ vim \ wget # install pwndbg WORKDIR /root RUN git clone https://github.com/pwndbg/pwndbg WORKDIR /root/pwndbg RUN git checkout 2023.03.19 RUN ./setup.sh # install pwntools RUN pip3 install --upgrade pip RUN pip3 install pwntools # install one_gadget command RUN gem install one_gadget WORKDIR /root μ—λŸ¬ λ°œμƒμ‹œ ν•΄κ²° partially initialized module 'pwndbg' has no attribute 'lib' μ—λŸ¬ λ°œμƒμ‹œμ—λŠ” μ‰˜ λͺ…령어에 export LANG=C.UTF-8 λ₯Ό μž…λ ₯ν•œλ‹€. μ‚¬μš©λ²• from pwn import * 을 톡해 λͺ¨λ“ˆμ„ λ‘œλ”©ν•œλ‹€. μ‹€ν–‰ process / remote target = process(파일경둜) 둜컬 νŒŒμΌμ„ exploit ν•˜κΈ°μœ„ν•œ λŒ€μƒμœΌλ‘œ μ„€μ •ν•œλ‹€. env 인자λ₯Ό μΆ”κ°€ν•˜μ—¬ ν”„λ‘œκ·Έλž¨ λ™μž‘μ‹œ 적용될 ν™˜κ²½λ³€μˆ˜λ₯Ό μ„€μ •ν•  수 μžˆλ‹€. λ‹€μŒμ€ libc νŒŒμΌμ„ μ›ν•˜λŠ” κ²½λ‘œμ—μ„œ 링킹 ν•˜λ„λ‘ μ„€μ •ν•˜λŠ” ꡬ문이닀. : target = process('./a.out', env= {"LD_PRELOAD" : "./libc.so.6"}) target = remote('λͺ©μ μ§€ ip', λͺ©μ μ§€ port) ip:port 에 μ—°κ²°λœ μ†ŒμΌ“μ„ exploit target으둜 μ„€μ •ν•œλ‹€. μ›κ²©μœΌλ‘œ μ ‘μ†ν•œ λͺ©μ μ§€μ˜ νŒŒμΌμ„ exploit ν•  λ•Œ μ‚¬μš©ν•œλ‹€. 데이터 μ†‘μˆ˜μ‹  send ...

<span title='2024-03-09 10:09:44 +0900 KST'>March 9, 2024</span>&nbsp;Β·&nbsp;7 min&nbsp;Β·&nbsp;AswinBlue