본문 바로가기

포너블

범용 레지스터 & gdb(pwndbg) & pwntools

자주 사용되는 범용 레지스터를 알아야 셸 코드를 짤 수 있는데 계속 까먹어서 따로 정리한다.

 

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