Linux 아래 pwn 입문 부터 포기 까지
9825 단어 ctf 의 wp
0x 03 디 버 깅 기술 gdb 에서 자주 사용 하 는 디 버 깅 명령: n: 한 줄 의 소스 코드 를 실행 하지만 함수 내부 에 들 어가 지 않 습 니 다 ni: 한 줄 의 어 셈 블 리 코드 를 실행 하지만 함수 내부 s 에 들 어가 지 않 습 니 다 s: 한 줄 의 소스 코드 를 실행 하고 함수 내부 에 들 어가 지 않 습 니 다 si: 한 줄 의 어 셈 블 리 코드 를 실행 하고 함수 내부 c: 다음 단점 b * 주소 로 계속 실행 합 니 다: 다음 단점 directory + 소스 코드 가 있 는 디 렉 터 리:로 딩 프로그램 원본 set follow - fork - mode parent: 메 인 프로 세 스 stack 만 디 버 깅: 스 택 정보 x: 16 진수 형식 으로 메모리 데 이 터 를 표시 합 니 다. 그 중에서 x/{바이트 수} x 는 16 진수 로 지정 한 주소 의 데 이 터 를 표시 합 니 다. {바이트 수} 은 바이트 수 제정 (b 단일 바이트, h 쌍 바이트, w 4 바이트, g 8 바이트, 기본 값 은 4 바이트) 을 표시 합 니 다.
프로그램 이 열 리 지 않 은 주소 에 세이 화:
def debug(addr):
raw_input('debug:')
gdb.attach(r, "b *" + addr)
프로그램 이 실 행 될 때 이 함 수 를 호출 하면 디 버 깅 할 수 있다.
프로그램 오픈 주소 랜 덤 화:
wordSz = 4
hwordSz = 2
bits = 32
PIE = 0
mypid=0
def leak(address, size):
with open('/proc/%s/mem' % mypid) as mem:
mem.seek(address)
return mem.read(size)
def findModuleBase(pid, mem):
name = os.readlink('/proc/%s/exe' % pid)
with open('/proc/%s/maps' % pid) as maps:
for line in maps:
if name in line:
addr = int(line.split('-')[0], 16)
mem.seek(addr)
if mem.read(4) == "\x7fELF":
bitFormat = u8(leak(addr + 4, 1))
if bitFormat == 2:
global wordSz
global hwordSz
global bits
wordSz = 8
hwordSz = 4
bits = 64
return addr
log.failure("Module's base address not found.")
sys.exit(1)
def debug(addr = 0):
global mypid
mypid = proc.pidof(r)[0]
raw_input('debug:')
with open('/proc/%s/mem' % mypid) as mem:
moduleBase = findModuleBase(mypid, mem)
gdb.attach(r, "set follow-fork-mode parent
b *" + hex(moduleBase+addr))
주 소 를 랜 덤 으로 열 면 ida pro 가 프로그램 을 열 면 프로그램의 오프셋 주 소 를 표시 하기 때문에 실제 주소 가 아 닙 니 다. 프로그램 이 불 러 온 프로그램의 실제 주 소 는 기본 주소 + 오프셋 주소 입 니 다. debug 함 수 를 호출 할 때 오프셋 주 소 를 전달 하면 0x4 libc 주소 와 버 전 을 누설 하 는 방법 [1] 입 니 다.포맷 문자열 구멍 을 이용 하여 스 택 의 데 이 터 를 누설 하여 libc 의 특정한 함수 주 소 를 찾 은 다음 에 libc - database 를 이용 하여 원 격 libc 버 전 을 판단 한 다음 에 libc 의 기본 주 소 를 계산 합 니 다. 보통 문 제 를 풀 때 저 는 libc start main 의 주 소 를 찾 는 것 을 좋아 합 니 다 [2].write 라 는 함 수 를 이용 하여 pwntools 는 이 함 수 를 이용 하여 프로그램의 각종 주 소 를 계산 할 수 있 습 니 다. 함수 의 기본 주소, libc 의 기본 주소, libc 중의 system 주 소 를 포함 합 니 다 [3]printf 함 수 를 이용 하여 printf 함수 출력 을 할 때 0x00 을 만 났 을 때 출력 을 중단 합 니 다. 입력 할 때 마지막 바이트 에 0x00 을 채 우지 않 으 면 출력 할 때 스 택 의 중요 한 데 이 터 를 누설 할 수 있 습 니 다. 예 를 들 어 libc 의 한 함수 주소 등 입 니 다.
0x 05 간단 한 스 택 넘 침 프로그램 은 어떠한 보호 도 열지 않 았 습 니 다. 방법 1: 전통 적 인 교재 사 고 는 셸 코드 를 스 택 에 기록 한 다음 에 프로그램 이나 libc 에 callesp 또는 jmp esp 가 있 는 지 찾 는 것 입 니 다. 예 를 들 어 이 제목:http://blog.csdn.net/niexinming/article/details/76893510 방법 2: 그러나 현대 운영 체제 에서 libc 에서 주 소 를 랜 덤 으로 열 수 있 기 때문에프로그램 에서 system 의 함 수 를 찾 은 다음 스 택 공간 을 배치 하고 gets (. bss) 를 호출 하 며 마지막 으로 system ('/bin/sh') 을 호출 합 니 다.예 를 들 어 이 제목:http://blog.csdn.net/niexinming/article/details/78796408 방법 3: 가상 시 계 를 덮 는 방식 으로 스 택 에 구멍 이 넘 치 는 것 을 이용 합 니 다. 이 방법 은 m4x 선생님 이 저 에 게 가르쳐 준 방법 입 니 다. 저 는 매우 교묘 하 다 고 생각 합 니 다. 예 를 들 어 이 문제 등 입 니 다.http://blog.csdn.net/niexinming/article/details/78144301
0x 06 nx 를 켜 는 프로그램 이 nx 를 켜 면 스 택 과 bss 세그먼트 는 읽 기와 쓰기 권한 만 있 고 실행 권한 이 없 기 때문에 rop 라 는 방법 으로 시스템 권한 을 가 져 야 합 니 다. 프로그램 이 복잡 하거나 프로그램 이 정적 으로 컴 파일 되면 ROPgadget 이라는 공 구 를 사용 하여 rop 이용 체인 을 직접 생 성 할 수 있 습 니 다. 가끔 은 많은 프로그램 이 ROPgadget 이라는 것 을 직접 사용 하지 못 할 때 가 있 습 니 다.하나의 도 구 는 체인 을 직접 찾 기 때문에 수 동 분석 프로그램 으로 getshell 을 찾 아야 합 니 다. 예 를 들 어 이 두 문제:http://blog.csdn.net/niexinming/article/details/78259866
0x 07 canary 를 시작 하 는 프로그램 에서 canary 를 시작 한 후 일반적인 넘 침 방법 으로 스 택 의 함 수 를 덮어 주 고 주 소 를 되 돌 릴 수 없습니다. 교묘 한 방법 으로 돌아 가 거나 리 canary 자체 의 약점 을 공격 해 야 합 니 다 [1]canary 를 이용 하여 flag 를 누설 합 니 다. 이 방법 은 canary 자체 의 약점 을 교묘 하 게 활용 합 니 다. stack check fail 일 때 실행 중인 프로그램의 이름 을 인쇄 합 니 다. 따라서 우 리 는 libc argv [0] 를 flag 의 주소 로 덮어 쓰 면 flag 를 인쇄 할 수 있 습 니 다. 예 를 들 어 이 제목:http://blog.csdn.net/niexinming/article/details/78522682 【2】printf 함 수 를 이용 하여 하위 프로 세 스 의 Canary 를 누설 하고 다른 하위 프로 세 스 스 택 에서 Canary 를 위조 하면 Canary 의 보 호 를 돌아 갈 수 있 습 니 다. 예 를 들 어 이 문제:http://blog.csdn.net/niexinming/article/details/78681846
0x 08 PIE 를 시작 하 는 프로그램 [1] printf 함 수 를 이용 하여 스 택 의 데 이 터 를 최대한 많이 인쇄 하고 유출 된 주소 에 따라 프로그램 기본 주소, libc 기본 주소, system 주 소 를 계산 합 니 다. 예 를 들 어 이 글 에서 echo 2 의 wp:http://blog.csdn.net/niexinming/article/details/78512274 【2】write 유출 프로그램의 핵심 정 보 를 이용 하면 Dynelf 라 는 함 수 를 편리 하 게 사용 할 수 있 습 니 다. 예 를 들 어 이 글 의 rsbo 2 문제 풀이 등 입 니 다.http://blog.csdn.net/niexinming/article/details/78620566
0x 09 모든 보호 오픈 프로그램의 스 택 이 완전히 제어 된다 면 프로그램의 보호 도 모두 열 릴 것 입 니 다. 예 를 들 어 이 문제:http://blog.csdn.net/niexinming/article/details/78666941
0x0a 포맷 문자열 구멍 포맷 구멍 은 현재 성숙 한 소프트웨어 에서 만 나 기 어렵 지만 이 구멍 은 매우 재 미 있 습 니 다 [1]pwntools 는 포맷 구멍 의 이용 점 을 자동 으로 계산 하고 payload 를 자동 으로 생 성 합 니 다. 예 를 들 어 이 문제:http://blog.csdn.net/niexinming/article/details/78699413 화해시키다http://blog.csdn.net/niexinming/article/details/78512274 중 echo 의 문제 풀이 [2]포맷 구멍 도 정보 유출 의 좋 은 동반자 다. 예 를 들 어 이 문제 에서 포맷 문자열 구멍 을 만들어 각종 데 이 터 를 유출 하 는 것 이다.http://blog.csdn.net/niexinming/article/details/78768850
0x0b uaf 구멍 을 쌓 은 후에 지침 지침 을 0 으로 정리 하지 않 고 지침 을 저장 하면 많은 문 제 를 일 으 킬 수 있다. 예 를 들 어 이 문제 등 이다.http://blog.csdn.net/niexinming/article/details/78598635
0x0c 임의의 위치 에서 프로그램 이 메모리 의 임의의 위치 에서 쓸 수 있다 면 위력 은 절대적 으로 크다 [1] 한 바이트 만 쓸 수 있 지만 프로그램 과 getshell 을 제어 할 수 있다. 예 를 들 어 이 문제 등 이다.http://blog.csdn.net/niexinming/article/details/78542089 【2】got 표를 수정 하 는 것 은 프로그램 절 차 를 제어 하 는 좋 은 방법 입 니 다. 많은 ctf 문 제 는 여러 가지 방법 으로 got 의 기록 을 제어 할 수 있 으 면 최종 적 으로 승 리 를 얻 을 수 있 습 니 다. 예 를 들 어 이 문제:http://blog.csdn.net/niexinming/article/details/78542089 【3】libc 의 기본 주 소 를 계산 할 수 있다 면 top chunk 지침 을 제어 하 는 것 도 문 제 를 푸 는 좋 은 방법 입 니 다. 예 를 들 어 이 문제:http://blog.csdn.net/niexinming/article/details/78759363