Hackerschool/Lord Of BOF

[*] gremlin - small buffer

Kostrian 2015. 1. 29. 10:05

처음 파일목록을 보면 gate와 마찬가지로 프로그램과 소스파일이 있습니다.


 

소스를 확인해 보면

 

 

먼저 힌트를 보면 

 - small buffer

라는 군요. 소스를 확인해 보니 배열 buffer의 크기가 16바이트로 매우 작다는것을 확인할수 있습니다.

 

다음은 소스를 분석해 보겠습니다.

 - 먼저 16바이트의 배열 buffer를 선언합니다.

 - 다음은 gate와 마찬가지로 파라미터의 갯수를 확인하고

 - strcpy를 실행시키고

 - buffer를 출력합니다.

 

이번에는 배열의 크기가 작기 때문에 쉘코드를 이용한 단순 BOF공격이 아닌 다른 방법을 생각해 봐야겠습니다. 작은 버퍼의 크기에서도 충분히 할수 있을만한 공격을 생각하다보니 저는 RTL방법을 사용하도록 하겠습니다.

 

그럼 이제 공격 방법을 설계해보도록 하겠습니다.

 1) gdb 로 ret의 자리를 분석

 2) 사용할 함수의 주소 알아내기 (여기서는 system함수가 됩니다.)

 3) /bin/sh의 주소 알아내기

 4) payload작성

 5) 공격

 

정도가 되겠습니다.

 

그럼 이제 공격을 시작해보도록 하죠.

gate와 마찬가지로 권한문제때문에 gdb로 분석이 안되기 때문에 복사본을 만들어서 분석하겠습니다.

 

 

buffer는 16바이트만큼 할당이 되고 4바이트만큼의 SFB 그다음 리턴주소가 되겠군요. (어느 커널버전의 리눅스는 변수가 선언되었을때 변수의 크기만큼만 스택에 공간이 할당되지 않는 경우, 즉 더미값이 생기게 되지만 현재 사용하고 있는 리눅스의 커널버전에서는 더미값이 생성되지 않습니다.) 잘못된 정보 죄송합니다. 원인이 커널 버전이 아닌 GCC버전때문에 생기는 현상입니다.

 

그럼 공격에 사용할 system함수의 주소를 찾아보겠습니다. (system("/bin/sh")를 호출하기 위해서 입니다.)

 

system함수의 주소에 접근할수 없다고 오류가 뜨지만 친절하게도 필요한 주소는 알려주는군요. 그럼 이제 이 주소를 이용해 /bin/sh의 주소를 알아낸 다음 payload를 작성하겠습니다.

 



 

위의 프로그램을 작성한뒤 실행시켜보면 /bin/sh의 주소를 구할수 있습니다.

이제 원하는 주소를 모두 구했습니다.

 * system : 0x40058ae0

 * /bin/sh : 0x400fbff9

 

그럼 구한 주소를 이용해 payload를 작성해 보겠습니다.

 

payload =  "\x90"*20+"\xe0\x8a\x05\x40"+"\x90"*4+"\xf9\xbf\x0f\x40"

 

payload를 분석해 보겠습니다.

 

앞의 nop가 20개 들어가는건 buffer의 크기[16] + SFB[4] = NOP[20]이 됩니다. 그리고 return이 들어갈 자리에 system의 주소가 들어간것을 보실수 있습니다. 그다음 NOP[4]가 들어가고 /bin/sh[4]의 주소가 들어갑니다. 이때 주의깊게 보셔야 할것이 return자리에 system의 주소가 들어간것과 그다음 NOP이 들어간것 그리고 /bin/sh이 들어간것입니다.

 - return자리에 함수가 들어가게 되면 자동으로 return은 그 다음 4바이트 후로 넘어가게 됩니다.

 - 즉, return 에 system이 들어갔으므로 새로운 return은 system다음 4바이트가 됩니다. (여기에서는 NOP로 대체했습니다.)

 - system 함수의 인자는 스택에서 system+8에 위치하게 됩니다.

 - 그렇기 때문에 여기서 /bin/sh는 NOP[4](새로운 return)가 들어간다음에 위치하게 되는것입니다.

 

그럼 payload작성을 마췄으니 공격을 시도해보도록 하겠습니다. (혹시 모르니 bash2를 이용합시다.)

 

공격에 성공하였습니다!

 

 [+] gremlin에는 많은 풀이법이 존재합니다.

 [+] 제가 사용한 방법은 사실 쉽지 않은 방법에 속합니다.

 [+] 이 문제의 풀이법은 환경변수를 이용한 방법과 에그쉘을 이용하는 방법이 존재합니다.

 

(사실 에그쉘은 사용할줄 모르고 환경변수를 이용한 방법은 무엇때문인지 쉘이 따지질 않더라구요)

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

[*] cobolt - small buffer + stdin  (0) 2015.01.29
[*] gate - simple BOF  (0) 2015.01.29