자주 사용되는 범용 레지스터를 알아야 셸 코드를 짤 수 있는데 계속 까먹어서 따로 정리한다.
gdb 역시 코드 분석에 필요한데 사용법, 명령어가 아직은 헷갈려서 정리한다.
리눅스의 실행파일 형식은 ELF인데 ELF의 헤더에는 실행에 필요한 여러 정보가 있다.
readelf -h 파일이름 으로 진입점, entry point를 확인할 수 있다.
그냥 gdb에서 entry 라고 치면 진입점부터 분석할 수 있다.
브레이크는 b *main 이런식으로 하고 run은 그냥 r 하나만 치면 된다.
b: break
c: continue
r: run
si: step into
ni: next instruction
i: info
k: kill
pd: pdisas
이런 명령어들이 있다.
disassemble main 이런식으로 디스어셈블을 할 수도 있다.
<pwntools>
from pwn import *
p = process('./test') # 로컬 바이너리 'test'를 대상으로 익스플로잇 수행
p = remote('example.com', 31337) # 'example.com'의 31337 포트에서 실행 중인 프로세스를 대상으로 익스플로잇 수행
익스플로잇을 할 서비스의 프로세스를 가져오는 코드이다.
p.send(b'A') # ./test에 b'A'를 입력
p.sendline(b'A') # ./test에 b'A' + b'\n'을 입력
p.sendafter(b'hello', b'A') # ./test가 b'hello'를 출력하면, b'A'를 입력
p.sendlineafter(b'hello', b'A') # ./test가 b'hello'를 출력하면, b'A' + b'\n'을 입력
데이터를 프로세스에 전송하기 위한 코드이다.
data = p.recv(1024) # p가 출력하는 데이터를 최대 1024바이트까지 받아서 data에 저장
data = p.recvline() # p가 출력하는 데이터를 개행문자를 만날 때까지 받아서 data에 저장
data = p.recvn(5) # p가 출력하는 데이터를 5바이트만 받아서 data에 저장
data = p.recvuntil(b'hello') # p가 b'hello'를 출력할 때까지 데이터를 수신하여 data에 저장
data = p.recvall() # p가 출력하는 데이터를 프로세스가 종료될 때까지 받아서 data에 저장
프로세스에서 데이터를 받기 위한 코드이다.
p.interactive()
interactive를 사용하면 직접 입력을 주면서 출력을 확인할 수 있다.
'포너블' 카테고리의 다른 글
드림핵 basic_exploitation_001 롸업 (1) | 2024.03.06 |
---|---|
드림핵 basic_exploitation_000 롸업 (0) | 2024.03.04 |
Stack Buffer Overflow & Return Address Overwrite 롸업 (0) | 2024.02.03 |
드림핵 shell_basic 롸업 (0) | 2024.02.02 |
Shellcode (0) | 2024.01.17 |