반응형
문제 다운로드
# wget http://pwnable.kr/bin/bof.c
실행
# ./bof
프로그램을 실행했을 때 입력값을 받는다.
아무 값이나 입력하고 실행해보니 Nah.. 라는 메시지가 출력된다.
# vim bof.c
gets를 통해 32바이트의 입력값을 받고
key 값이 0xcafebabe라면 셸을 실행하도록 코딩되어 있다.
아무 값이나 입력하고 실행해보니 Nah.. 라는 메시지가 출력된다.
소스 확인
gets를 통해 32바이트의 입력값을 받고
key 값이 0xcafebabe라면 셸을 실행하도록 코딩되어 있다.
메인 함수에서는 0xdeadbeef를 인자로 넘기기 때문에
그냥 실행하면 무조건 else문이 실행된다.
여기서 gets는 입력 길이 검증을 하지 않는 보안에 취약한 함수다.
스택 내에서 "key" 값을 찾아야 한다.
찾은 공간을 임의의 문자열로 덮어씌우고
키 위치 부분부터 cafebabe를 입력하면 된다.
어셈블리 분석 디버거인 gdb를 사용하여
bof 프로그램의 main과 func 함수를 확인한다.
# gdb bof
그냥 실행하면 무조건 else문이 실행된다.
여기서 gets는 입력 길이 검증을 하지 않는 보안에 취약한 함수다.
BOF
스택 내에서 "key" 값을 찾아야 한다.
찾은 공간을 임의의 문자열로 덮어씌우고
키 위치 부분부터 cafebabe를 입력하면 된다.
어셈블리 분석 디버거인 gdb를 사용하여
bof 프로그램의 main과 func 함수를 확인한다.
# gdb bof
main 함수에서 func 함수를 호출하는 부분이다.
아래 사진의 func 함수를 보면 두 값을 비교하고 있는 코드를 확인할 수 있다.
따라서 0x8(%ebp)에 해당 값을 cafebabe로 덮어씌우면 된다.
그러나 프로그램 값을 입력하는 시작주소가 어딘지 알아야
해당 위치까지 찾아가 데이터를 덮어씌울 것이다.
그러기 위해 먼저 overflowme 배열의 시작 주소를 알아야 한다.
아래 코드는 사용자가 입력한 값이 저장되는 gets 함수이다.
ebp-0x2c에 입력한 값이 저장되고 있으므로
해당 부분이 overflowme 배열 시작 주소라는 것을 알 수 있다.
키와 배열의 오프셋을 계산해보면 0x8-(-0x2c) = 52만큼 떨어져 있다.
즉, 임의의 데이터를 52만큼 채우면 키 값을 비교하는 코드에 도달할 수 있고
그곳에 cafebabe를 채워주면 된다.
BOF 코드는 python 스크립트로 작성했다.
# (python -c 'print "a"*52 + "\xBE\xBA\xFE\xCA"'; cat) | nc pwnable.kr 9000
해당 부분이 overflowme 배열 시작 주소라는 것을 알 수 있다.
키와 배열의 오프셋을 계산해보면 0x8-(-0x2c) = 52만큼 떨어져 있다.
즉, 임의의 데이터를 52만큼 채우면 키 값을 비교하는 코드에 도달할 수 있고
그곳에 cafebabe를 채워주면 된다.
BOF 코드는 python 스크립트로 작성했다.
# (python -c 'print "a"*52 + "\xBE\xBA\xFE\xCA"'; cat) | nc pwnable.kr 9000
실행된 셸에서 flag 파일을 조회해보면 정답이 있다.
반응형
'해킹-보안' 카테고리의 다른 글
Burpsuite XSS Validator (0) | 2020.10.15 |
---|---|
쉘코드 작성하기 (0) | 2020.10.08 |
pkcrack을 사용하여 압축파일 해제하기 (0) | 2020.08.03 |
CVE 찾는 과정 (0) | 2020.07.28 |
버프스위트(Burpsuite) 기능 활용 (0) | 2020.07.26 |