외로운 Nova의 작업실

dreamhack 시스템해킹 - 3(리눅스, gdb, pwntools, python사용법) 본문

Computer App Penetesting/System Vulnerability

dreamhack 시스템해킹 - 3(리눅스, gdb, pwntools, python사용법)

Nova_ 2022. 12. 28. 17:08

- 리눅스

<컴파일>

gcc test.c -o test.exe

프로텍트 미적용
gcc test.c -o test.exe -fno-stack-protector -no-pie

32비트 컴파일
gcc  -o  test  test.c  -m32

오브젝트 파일 생성
gcc -c test.c

<vi 사용법>

via test.c #파일만들기 및 수정

 

<오브젝트파일을 어셈블리어로 보기>

$ objdump -d shellcode.o
$ objcopy --dump-section .text=shellcode.bin shellcode.o
$ xxd shellcode.bin

 

- gdb

ni : nexti 함수내부로 안들어갑니다.

si : stepi 함수내부로 들어갑니다.

b : b *함수주소 또는 b 함수이름 으로 브레이크를 겁니다.

[print 함수이름]을 하면 함수의 주소를 알 수 있습니다.

x/[출력 개수]w 주소 : 주소부터 출력 개수만큼 4바이트씩 출력합니다.

watch *(주소) : 주소에 하드웨어 bp를 겁니다.

catch systemcall 함수이름 : syscall 함수가 실행되면 프로세스를 멈춥니다.

 

-pwntools

<process, remote>

from pwn import *
p = process('./test') #로컬 바이너리 'test'를 대상으로 익스플로잇 수행
p = remote('example.com',31337) #'example.com'의 31337 포트에서 실행 중인 프로세스를 대상으로 익스플로잇 수행

<send>

from pwn import *
p = process('./test')
p.send('A') # ./test에 'A'를 입력
p.sendline('A') # ./test에 'A'+'\n'을 입력
p.sendafter('hello','A') # ./test가 'hello'를 출력하면, 'A'를 입력
p.sendlineafter('hello','A') # ./test가 'hello'를 출력하면, 'A' + '\n'을 입력

<recv>

from pwn import *
p = process('./test')
data = p.recv(1024) #p가 출력하는 데이터를 최대 1024바이트까지 받아서 data에 저장
data = p.recvline() #p가 출력하는 데이터를 개행문자를 만날 때까지 받아서 data에 저장
data = p.recvn(5) #p가 출력하는 데이터를 5바이트만 받아서 data에 저장
data = p.recvuntil('hello') #p가 출력하는 데이터를 'hello'가 출력될 때까지 받아서 data에 저장
data = p.recvall() #p가 출력하는 데이터를 프로세스가 종료될 때까지 받아서 data에 저장

<p64, u64>

#!/usr/bin/python3
#Name: pup.py
from pwn import *
s32 = 0x41424344
s64 = 0x4142434445464748
print(p32(s32)) //->  \x44\x43\x42\x41
print(p64(s64)) //->  \x48\x47\x46\x45\x44\x43x\42\x41
s32 = "ABCD"
s64 = "ABCDEFGH"
print(hex(u32(s32)))
print(hex(u64(s64)))



$ python3 pup.py
b'DCBA'
b'HGFEDCBA'
0x44434241
0x4847464544434241

<interactive>

from pwn import *
p = process('./test')
p.interactive() //이걸해야 shell을 받아볼 수 있습니다.

<header>

from pwn import *
e= ELF('./test')
puts_plt = e.plt['puts'] # ./test에서 puts()의 PLT주소를 찾아서 puts_plt에 저장
read_got = e.got['read'] # ./test에서 read()의 GOT주소를 찾아서 read_got에 저장

<log_level>

from pwn import *
context.log_level = 'error' # 에러만 출력
context.log_level = 'debug' # 대상 프로세스와 익스플로잇간에 오가는 모든 데이터를 화면에 출력
context.log_level = 'info'  # 비교적 중요한 정보들만 출력

<arch>

from pwn import *
context.arch = "amd64" # x86-64 아키텍처
context.arch = "i386"  # x86 아키텍처
context.arch = "arm"   # arm 아키텍처

<shellcraft>

#!/usr/bin/python3
#Name: shellcraft.py
from pwn import *
context.arch = 'amd64' # 대상 아키텍처 x86-64
code = shellcraft.sh() # 셸을 실행하는 셸 코드 
print(code)
#!/usr/bin/python3
#Name: asm.py
from pwn import *
context.arch = 'amd64' # 익스플로잇 대상 아키텍처 'x86-64'
code = shellcraft.sh() # 셸을 실행하는 셸 코드
code = asm(code)       # 셸 코드를 기계어로 어셈블
print(code)

 

- python

 

nova@DESKTOP-H1QON9S:~$ vi shell_basic.py
nova@DESKTOP-H1QON9S:~$ python3 shell_basic.py
Comments