LOB Fedora FC3 - gate -> iron_golem 공략

해킹대회 문제 풀이 연습장소

Moderator: amesianx

Post Reply
KSH
Posts: 24
Joined: Thu Jul 21, 2016 5:39 pm

LOB Fedora FC3 - gate -> iron_golem 공략

Post by KSH » Mon Nov 07, 2016 12:38 am

LOB 레드헷을 풀고나서 FC3도 해보기로 했습니다.

1.홈 디렉터리 파일목록
1.png
1.png (3.95 KiB) Viewed 359 times
gate를 열어 iron_golem을 만나러 가야합니다.

2.소스코드
2.png
2.png (7.87 KiB) Viewed 359 times
소스는 정말 간단합니다. 256byte의 buffer 그리고 인자수가 2개보다 적으면 에러메시지와 함께 종료
2개 이상이라면 argv[1]의 값을 buffer에 복사한 후 복사한 내용을 출력하고 종료합니다.
힌트는 fake ebp네요

3.LOB 페도라와 레드헷의 다른점
페도라는 레드헷 9.0에 비해 공략하기 까다롭다고 합니다.
스택사이에 더미가 있고 ASCII Armor가 걸려있어서 공유라이브러리주소의 최상위 바이트가 0x00이되어 연속적인 함수호출이 불가능합니다.
그리고 스택과 힙의 코드를 실행할 수 없을 뿐더러 랜덤스택까지 적용되어있어 어렵다고 합니다.
실험해보기 위해 쉘코드를 환경변수에 저장하였고 다음 프로그램으로 환경변수의 주소를 출력해보았습니다.
3.png
3.png (3.36 KiB) Viewed 359 times
4.png
4.png (5.6 KiB) Viewed 359 times
환경주소가 랜덤입니다...
스택과 힙의 코드 실행불가, ASLR, ASCII Armor 등의 보안이 적용되어있습니다.
그래서 fake ebp를 사용해야 하는 것 같습니다.
변하지 않는 일정한 주소를 가지고있으면서도 실행시킬수 있는 영역을 이용하여 공략하면 성공하니까요

4.분석
5.png
5.png (31.17 KiB) Viewed 359 times
소스코드에는 buffer에 256byte를 할당하지만 gdb에서는 스택에 0x108(264byte)를 할당합니다. (더미가 붙네요)
페이로드는 | buffer(256) | + | SFP(4) | + | RET(4) | 가 됩니다.
랜덤스택이 적용되어있으므로 환경변수를 이용할 수 없습니다.
더군다나 ASCII Aamor까지 적용되어있어 ret뒤에 "/bin/sh"의 공유라이브러리 주소마저 사용할 수가 없을 뿐더러
스택에서 코드를 실행할 수도 없어요. 그래서 execl함수와 변하지 않는 got을 이용할겁니다.
6.png
6.png (4.72 KiB) Viewed 359 times
주소는 0x08049618입니다.
7.png
7.png (5.39 KiB) Viewed 359 times
execl함수의 주소는 0x7a5720입니다.

execl함수의 프로토타입은 int execl(const char *path, const char *arg0, ..., const char *argn, (char *)0); 입니다.
첫번째 인자는 프로그램의 경로, 두번째 부터는 프로그램의 인자, 마지막으로 0(NULL)입니다.
path에 들어갈 값을 구하기 위해 got을 조사하였습니다.
8.png
8.png (4.55 KiB) Viewed 359 times
got(0x08049618)에는 0x0804954c라는 값이 들어있는데 그 안에는 \x01이 저장되어있습니다.
got+4(0x0804961c)에는 0x007194f8이라는 값이 들어있는데 그 안에는 0(NULL)이 저장되어있습니다.

execl함수의 인자의 path로 \x01을, arg0의값에 NULL을 넣어주면 문제없이 프로그램을 실행할 수 있을겁니다.
execl함수로 쉘을 실행시키기 위해 다음과 같은 소스코드를 작성했습니다.
9.png
9.png (3.38 KiB) Viewed 359 times
실행시키면 서브쉘을 띄웁니다.
10.png
10.png (3.72 KiB) Viewed 359 times
이제 재료가 전부 모였습니다. 페이로드는 다음과 같습니다.
| buffer(264) | + | sfp(got's Address) | + | execl |

※프로그램을 공략하기 전에 주의할것※
{
execl함수에 사용할 path는 "\x01"이므로 심볼릭 링크를 이용하여 서브쉘을 띄우는 프로그램의 파일명을 \x01로 바꿔줍니다.
12.png
12.png (3.01 KiB) Viewed 359 times
execl함수는 ebp + 8 의 주소에 있는 값을 인자로 사용합니다.
즉! got주소(0x08049618)에서 8을 뺀 0x08049610을 사용합니다.
그리고 execl함수도 일반 함수와 마찬가지로 함수프롤로그가 있는데 함수프롤로그를 실행한다면
fake ebp기법으로 애써서 바꿔놓은 sfp가 다시 바뀌겠지요? ㅋ 그럼 execl함수가 무의미해집니다.
11.png
11.png (3.04 KiB) Viewed 359 times
execl함수의 프롤로그부분을 생략한 execl+3부분인 0x7a5723을 사용합니다.
}

4.공략
공격코드를 작성했습니다만
13.png
13.png (8.56 KiB) Viewed 359 times
버전이 낮아서 그런건지;;
14.png
14.png (4.39 KiB) Viewed 359 times
안됩니다.. ㄱㅡ

./iron_golem `python -c 'print "A"*264 + "\x10\x96\x04\x08" + "\x23\x57\x7a\x00"'`
15.png
15.png (8.24 KiB) Viewed 359 times
깼습니다.

최근 학교에서 진행중인 프로젝트로 인해 주말에도 학교에 가기에 시간이 줄어들어 활동이 줄어들고 있습니다.
프로젝트가 끝나고 졸업을 한 이후에는 더 열심히 활동하겠습니다.

Post Reply

Who is online

Users browsing this forum: No registered users and 17 guests