외로운 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
'Computer App Penetesting > System Vulnerability' 카테고리의 다른 글
dreamhack 시스템해킹 - 5(shell_basic 문제풀이) (0) | 2023.01.03 |
---|---|
dreamhack 시스템해킹 - 4(shell code) (0) | 2023.01.02 |
dreamhack 시스템해킹 - 2(memory layer) (0) | 2022.12.20 |
dreamhack 시스템해킹 - 1(리눅스 환경 설정) (0) | 2022.12.19 |
Programm Hacking Challenge - 1(악성 코드 심기) (0) | 2022.08.24 |
Comments