시작하는 방법
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
'리버싱 > 리눅스' 카테고리의 다른 글
심볼 파일? 심볼 테이블? (0) | 2020.02.09 |
---|---|
DIMICTF 2019 : ropsaurusrex2 (ROP, PIE기법) (0) | 2020.02.09 |
드림핵 System Exploitation Fundamental (2) : Memory Corruption (0) | 2020.02.05 |
DIMICTF 2019 : ezshellcode (쉘코드) (0) | 2020.02.05 |
드림핵 System Exploitation Fundamental (1) : 개요 (0) | 2020.02.04 |