본문 바로가기

리버싱/리눅스

문제를 풀기위한 팁 및 도구사용법 모음

시작하는 방법

Entry Point 

 C -> main

 Assembly -> _start 

 

gdb로 프로그램 실행시킨 뒤 break point를 Entrypoint에 걸면 된다.

> b _start

 

 

함수의 주소가 text 영역에 있다면 사용자가 직접 작성한 코드이다.

plt, got, external 영역에 존재한다면 라이브러리에서 가져오는 함수인것이다. 

 

 

 

 

 

도구 사용법 

IDA

Ctrl+E : 엔트리포인트 찾을수있음

함수이름 클릭하고 x 누르면 함수를 호출한곳을 찾을수있다.

원하는명령을 클릭하고 Ctrl+N 누르면 그냥 갈수있다 (jmp 분기분에서 사용하면됨)

 

 

pwntool

설치

윈도우 환경에서는 python3버전에 대한 pwntools가 제공되지 않는다.

# apt-get update

# apt-get install python3 python3-dev python3-pip git

# pip3 install --upgrade git+https://github.com/arthaud/python3-pwntools.git

 

주소패킹

`python -c 'import struct; p=lambda x:struct.pack("<Q",x); p(0x12)'`

-> '\x12\x00\x00\x00\x00\x00\x00\x00'

 

데이터 전달

프로그램에서 직접 입력한 경우와 다르게 byte를 직접 전달할 수 있고 엔터를 입력하지 않았기 때문에 \x0a값이 포함되지 않는다. 또한 \x00앞부분 까지만 전달하기 때문에 \x00은 전달되지 않는다. 

s = remote("192.168.100.153", 42323)

dummy = "a"*56
overwrite = "\x16"
payload = dummy + overwrite
s.send(payload)

 

 

 

 

gdb (gdb-peda)

설치

# apt install gdb

# git clone https://github.com/longld/peda.git ~/peda

# echo "source ~/peda/peda.py" >> ~/.gdbinit

 * .gdbinit : gdb 실행 시 맨처음 불러오는 환경설정 파일. 세번째 줄을 추가해줘야 gdb가 gdb-peda로 실행된다.

 

https://go-madhat.github.io/gdb-peda/

 

사용자 입력에 바이트 전달

(gdb) r <<< `python -c 'print "\x10\x10"'`

(gdb) r <<< `python3 -c 'print("\x10\x10")'`

위 방식으로 바이트를 전달할때는 프로그램 실행중 사용자가 직접 입력한것과 동일하게 개행(\x0a)이 포함된다.

하지만 python send 함수를 통해 서버로 전달할때는 \x0a가 포함되지 않는다.

 

ASLR on 명령

(gdb) set disable-randomization off   

on으로 설정하면 ASLR이 꺼진다. 

 

현재 내용 재출력

화면이 작아서 의도치않게 출력이 잘린경우 화면을 키우고 context명령을 사용하면 재출력된다.

(gdb) context 

 

 

ghidra

Alt + <- : 이전에 보고있던 명령

Alt + -> : 위와 반대. 다시 명령 앞으로 돌아오기

 

 

 

one_gadget

원샷 가젯 코드를 검색할때 사용되는 도구이다.

# apt-get install ruby

# gem install one_gadget

# one_gatget --version