Linux 아래 pwn 입문 부터 포기 까지

9825 단어 ctf 의 wp
0x0 프로필 pwn 은 보안 분야 에서 바 이 너 리/시스템 호출 등 을 통 해 대상 호스트 의 셸 을 얻 는 것 을 말한다.비록 웹 시스템 은 인터넷 에서 비교적 큰 분량 을 차지 하지만 모 바 일 엔 드, iot 의 유행 에 따라 전통 적 인 버퍼 가 넘 쳐 서 다시 무 예 를 사용 하 는 곳 이 생 겼 습 니 다. 0x 01 작업 을 잘 하려 면 먼저 리 눅 스 의 Pwn 에서 자주 사용 하 는 도 구 는 다음 과 같 습 니 다. (1) gdb: Linux 디 버 깅 에 필요 한 (2) gdb - peda: gdb 디 버 깅 이 편리 한 도구 입 니 다. 유사 한 도 구 는 gef 가 있 습 니 다.gdbinit, 이 도구 들 의 설 치 는 참고 할 수 있 습 니 다:http://blog.csdn.net/gatieme/article/details/63254211 (3) pwntools: exp 와 poc 를 쓰 는 이기 (4) checksec: elf 프로그램의 안전성 과 프로그램의 운영 플랫폼 (5) objdump 와 readelf: elf 프로그램의 핵심 정 보 를 빨리 알 수 있 습 니 다 (6)ida pro: 강력 한 컴 파일 도구 (7) ROPgadget: 강력 한 rop 이용 도구 (8) onegadget: libc 에서 호출 된 exec ('bin/sh') 의 위치 (9) libc - database: 유출 된 libc 의 한 함수 주 소 를 통 해 원 격 시스템 이 사용 하 는 libc 버 전 0x 02 에서 elf 의 안전성 을 찾 을 수 있 습 니 다.(1) efl 을 받 으 려 면 먼저 checksec 로 elf 가 어느 플랫폼 에서 실행 되 고 있 는 지, 어떤 안전 조 치 를 열 었 는 지 확인 해 야 합 니 다. gcc 로 컴 파일 한 후에 모든 안전 조 치 를 기본적으로 열 수 있 습 니 다. [1] RELRO: RELRO 는 Partial RELRO 와 FULL RELRO 가 있 습 니 다. FULL RELRO 를 열 면 got 표 [2] 를 수정 할 수 없다 는 뜻 입 니 다.Stack: 스 택 에서 Canary found 를 열 면 넘 치 는 방법 으로 스 택 의 주 소 를 덮어 쓰 지 못 하고 포인터 와 부분 변수, leak canary, overwrite canary 를 바 꾸 는 방법 으로 돌아 가 야 합 니 다 [3]NX: NX enabled 이 보호 가 열 리 면 스 택 에 있 는 데이터 가 실행 권한 이 없다 는 것 을 의미 합 니 다. 예전 에 자주 사용 하 던 콜 esp 나 jmp esp 방법 은 사용 할 수 없 지만 rop 라 는 방법 으로 돌아 갈 수 있 습 니 다 [4]PIE: PIE enabled 프로그램 이 이 주소 랜 덤 화 옵션 을 열 면 프로그램 이 실 행 될 때마다 주소 가 변 하 는 것 을 의미 합 니 다. PIE 를 열지 않 으 면 No PIE (0x 400000), 괄호 안의 데 이 터 는 프로그램의 기본 주소 입 니 다 [5] FORTIFY: FORTIFY SOURCE 메커니즘 은 포맷 문자열 에 대해 두 가지 제한 이 있 습 니 다 (1)% n 을 포함 하 는 포맷 문자열 은 프로그램 메모리 에 쓸 수 있 는 주소 에 있 을 수 없습니다. (2) 위치 파 라 메 터 를 사용 할 때 범위 내 모든 파 라 메 터 를 사용 해 야 합 니 다. 따라서% 7 $x 를 사용 하려 면 1, 2, 3, 4, 5 와 6 을 동시에 사용 해 야 합 니 다.
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

좋은 웹페이지 즐겨찾기