Hackerschool/Lord Of BOF

[*] gate - simple BOF

Kostrian 2015. 1. 29. 10:00
처음 gate로 접속을 하면 gremlin이라는 프로그램과 그 소스파일이 있는것을 확인할수 있습니다.



소스를 확인해 보면,

 

 

먼저 힌트를 분석해 볼게요.

- simple BOF

간단한 BOF공격을 하면 되나봅니다.

 

소스를 분석해 볼게요.

 - buffer라는 256바이트의 배열을 선언을 한다음 

 - 파라미터의 갯수가 1개이면 프로그램을 종료

 - 2개 이상일시 2번째 파라미터를 buffer에 저장

 - buffer를 출력

 

여기서 BOF공격을 시도하기 위해선 strcpy함수의 취약점을 공격하면 될거같습니다.

 * strcpy의 취약점

 - 이 함수는 문자열의 길이를 제한하지 않아 입력받는 모든 문자열을 변수에 저장하게 됩니다.

 - 이는 선언된 변수의 크기보다 큰 문자열이 입력될 경우 Overflow현상을 일으키게 됩니다.

 

그럼 이제 공격 방법을 구상해 보겠습니다.

 1) gdb로 프로그램을 분석하여 배열이 스택에 할당된 크기를 분석

 2) return주소로 주어질 주소를 분석

 3) 쉘코드를 이용한 payload작성

 4) 공격

 

자 그럼 본격적으로 풀이에 들어가겠습니다.

 1) gdb로 프로그램 분석

 

 

gdb로 main을 열어본 모습입니다. 분석을 해보면

 - 스택에 0x100만큼 즉, 256만큼의 공간을 할당하고

 - [ebp+8]을 1과 비교해서 크면 main+38부분으로 점프하고 같거나 작으면 printf를 실행하고 종료 (if문에서 파라미터값이 2개 이상이면 if문 점프)

 - argv[1]의 주소를 edx에 저장하고 스택에 push

 - buffer의 주소를 eax에 저장하고 스택에 push

 - strcpy실행

 - buffer의 주소를 eax에 저장

 - printf실행

 - return

 

여기서 buffer의 시작점이 [ebp-256]이란걸 알수 있습니다. 그럼 프로그램을 실행시켜서 스택안을 채워 볼게요.

 

 

이런, 권한문제로 실행이 되질 않습니다. 그럼 gate권한으로 분석을 하기 위해 gremlin을 복사해서 분석해보도록 하겠습니다.

 

gremlin을 복사한뒤 strcpy가 실행된 직후의 스택을 살펴볼게요.

 - A는 buffer의 크기만큼 들어가게 됩니다.

 - 이때 B*4는 SFP, C*4는 return자리에 들어가게 됩니다.

 - return 주소는 0xbffff938근처가 되겠습니다.

 

그럼 이를 이용해서 payload를 작성해 보겠습니다.

 [*] payload

 - (nop[235] + shell[25]) + return[4]로 구성이 되겠습니다.

 - nop[100] + shell[25] + nop[135] + return[4]정도로 구성하면 되겠습니다.

 - 그럼 완성된 payload는 

"\x90"*100+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"+"\x90"*135+return

이 되겠습니다.

 

 **nop가 payload에 쓰이는 이유?

 - BOF의 기법중 nop슬라이드라는 기법이 있습니다.

 - 컴퓨터는 nop를 아무런 의미가 없는 말로 생각하고 그냥 지나쳐 지나갑니다.

 - 이는 return으로 주어질 주소의 범위를 넓혀주기도 합니다.

 - return주소로부터 컴퓨터는 nop가 있는 범위를 미끄러져 지나칩니다.

 - 그러다 쉘코드를 만나게 되면 쉘코드를 실행시키고 쉘을 흭득하게 되는겁니다.

 

그럼 이값을 이제 gdb에 입력해보겠습니다.

 

 

이런, return자리에 제대로된 주소가 아닌 0x4000f938이 들어간걸 알수 있는데요. 알아본 결과 이는 bash의 버그라고 합니다. 이는 bash2로 넘어오면서 픽스됬다고 하니 bash2로 하면 될거같습니다.

 

공격에 성공하였습니다!

'Hackerschool > Lord Of BOF' 카테고리의 다른 글

[*] cobolt - small buffer + stdin  (0) 2015.01.29
[*] gremlin - small buffer  (0) 2015.01.29