2010.03.28 11:06 WarGame


문제 설명입니다

credentials: ctf4.codegate.org port - 9000, 9002, 9004, 9005, 9006 (you can choose any port)

BINARY FILE: http://ctf.codegate.org/files____/easy


해당 포트에 접속해보면



매우 간단해 보이네요

바이너리 파일은 위 주소에서 구할 수 있습니다

간단한 오버플로우 문제 같군요

먼저 hex ray로 소스를 보면




약간 꼬아놓긴 했습니다만 오버 플로우 취약점이 있다는 것은

누구나 매의 눈으로 찾아 낼 수 있습니다

일반적인 경우는 아니군요

쉘 코드를 집어넣을 적절한 장소가 필요합니다

마침 func 함수에 적절한 크기의 변수가 할당되어 있군요

할당된 크기를 보면 char형의 264크기의 배열이 할당되었다고 보시면 되구요

저기에 쉘 코드를 넣은 다음 RET을 시작 주소로 바꿔주면 되겠습니다만

요는 저 문제에 적용된 Overflow 방지 기법이겠죠

문제 2번에서 제공된 ID , PW 로 ctf4 서버로 접속해서 확인해보면




힙, 스택 주소가 계속 바뀌는걸 볼 수 있습니다

조금 전에 생각했던 RET 을 dest의 주소로 덮어씌우는 단순 방식은

정확한 stack 주소를 얻어내야 하기 떄문에

좀 어렵게 되었군요  

[ 윈도우에서도 Vista 부터 같은 원리의 기법이 적용된 바 있는데요

ASLR(Address Space Layout Randomization) 으로 불리며

Reversecore님의 잘 정리된 자료는

http://www.reversecore.com/69 에서 참고하실 수 있습니다 ]

이를 우회하는 방식은 발표 자료로 정리한게 있는데

http://linkc.tistory.com/entry/26-kernel-에서의-BOF

를 보셔도 좋구요

ASLR 우회 기법을 샘플 코드와 그림까지 첨부한 문서인

http://www-users.rwth-aachen.de/Tilo.Mueller/ASLRpaper.pdf

을 보시면 됩니다

문제 풀이에는 RTL  기법을 적용하는 방법이 있겠습니다만

이번 문제는 문제 자체 소스의 특성을 이용해 보도록 합시다

memcpy가 func 함수에서 가장 나중에 쓰인 것을 볼 수 있습니다

memcpy가 리턴값으로 Destination address를 준다는 건 혹시 알고 계신가요?

이를 이용해봅시다

그러니까 리턴값을 저장하는 eax는  Dest 의 주소를 가진다는 거겠죠

이 eax를 이용해 볼까요?




이런식으로 Exploit이 진행 될 수 있습니다

이제 전체적인 코드를 짜볼까요

먼저 필요한건

1. shell code

2. shell code와 eax를 채워줄 dummy byte

3. call eax 를 실행하는 text 영역의 주소


*이 3가지는 스택이나 힙 변화에 영향을 받지 않으므로

이 문제를 해결하는데 유효 합니다


먼저 ctf4 서버에 접속해서 reverse shell 이나 bind shell 등

뭐가 좋을까 봤는데

어째 문제 서버에서 외부로 연결이 잘 안되군요 -.-

애초에 문제 포트를 빼고 외부로의 연결을 막아놓은 건지는 잘 모르겠습니다만

저는 reverse shell 을 하되 주소를 127.0.0.1 으로 주어 서버 자신의 포트로 reverse telnet 을 걸었고

서버에 미리 접속해서 그  특정 포트에서 응답을 대기하도록 했습니다

dummy byte는 shell code + dummy byte = 264 byte

로 간단히 쉘코드 길이를 계산해서 넣으면 되겠쬬

그다음은 call eax 를 실행하는 text 영역의 주소가 필요합니다

이는 IDA 를 사용하거나 Metasploit을 이용하면 되겠군요






두 주소 모두 같은 명령어니까 아무거나 집어넣어도 상관 없습니다

0x080484df를 이용해봅시다




문제 서버에 접속해서 미리 포트를 열고 대기하고

공격을 하면...






P.S

http://coma.0x3f.net/uncategorized/codegate2010-ctf-level-4

에서 풀이도 봤습니다

쉘 코드가 264 byte에 충분히 들어가지만

안들어가는 경우를 생각했던건지

다소 복잡하지만 재밌는 방법을 사용했더군요








Posted by LinkC

블로그 이미지
LinkC

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

공지사항

Yesterday48
Today22
Total328,664

달력

 « |  » 2019.5
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

최근에 받은 트랙백

글 보관함


. .