LOB - zombie_assassin -> succubus

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

Moderator: amesianx

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

LOB - zombie_assassin -> succubus

Post by KSH » Wed Aug 10, 2016 4:59 pm

좀비어쌔신을 잡아봅시다.
1.홈 디렉터리
1.png
1.png (3.99 KiB) Viewed 623 times
2.소스코드

<전역변수 부분>
소스_1.png
소스_1.png (5.41 KiB) Viewed 623 times
<사용자 정의 함수 부분>
소스_2.png
소스_2.png (11.19 KiB) Viewed 623 times
<메인함수>
소스_3.png
소스_3.png (15.56 KiB) Viewed 623 times
소스가 길어졌습니다. 이 프로그램은 우선 int형 전역변수 check를 선언하고 0으로 초기화합니다.
그리고 사용자 정의 함수들이 있는데, DO함수는 welcome to the Do라는 문자열을 출력 후 check를 1로합니다.
GYE함수는 check가 1이 아니라면 종료하고 1이라면 문자열 출력후 check를 2로합니다.
GUL함수는 check가 2가 아니라면 종료하고 2이라면 문자열 출력후 check를 3으로합니다.
YUT함수는 check가 3이 아니라면 종료하고 2이라면 문자열 출력후 check를 4로합니다.
MO함수는 char형의 *cmd를 인자로 받아 실행됩니다.
check가 4가 아니라면 종료하고 4라면 문자열 출력후 system함수에 *cmd를 인자로 넣어 실행합니다.

메인함수에서는 40byte의 char형 배열 buffer와 addr포인터를 선언합니다.
메인함수의 인자수가 2보다 작다면 프로그램을 종료합니다.
그리고 strch함수로 argv[1]에 있는 문자열에서 \x40을 검색하여 \x40이 존재한다면 프로그램을 종료합니다.
addr포인터에 DO함수의 주소를 넣은 뒤 return 주소가 addr의 값과 일치하지 않을 때에도 종료합니다.

그 후에 buffer에 argv[1]의 내용을 복사하고 buffer의 시작점부터 SFP까지 모두 0으로 만들어버리고
return주소+100지점부터 끝까지 0으로 만들어버리며, buffer-3000부분부터 전부 0으로만들어
스택을 봉쇄합니다.

이 프로그램을 공략하기 위해서는 리턴주소를 조작해야 합니다.
return 주소를 DO(도)의 주소로 바꾸어 종료조건을 피하고 check를 1로,
DO의 리턴주소에 GYE(개)함수의 주소를 넣어 check를2로,
GYE의 리턴주소에 GUL(걸)함수의 주소를 넣어 check를 3으로,
GUL의 리턴주소에 YUT(윳)함수의 주소를 넣어 check를 4로,
YUY의 리턴주소에 MO(모)함수의 주소를 넣고, 리턴주소에는 dummy를,
MO함수의 ebp+8지점에는 /bin/sh의 주소를 넣는다면,
system("/bin/sh")이 실행되면서 공격에 성공합니다.

3.분석
disas_main.png
disas_main.png (6.11 KiB) Viewed 623 times
스택에 0x2c(44byte)만큼의 공간을 할당하였습니다.

스택의 구조는 이렇게됩니다.
|check| + |buffer| + |SFP| + |RET|
낮은주소 높은주소
nm.png
nm.png (3.08 KiB) Viewed 623 times
DO(도) : 0x080487ec
GYE(개) : 0x080487bc
GUL(걸) : 0x0804878c
YUT(윳) : 0x0804875c
MO(모) : 0x08048724

페이로드는 이렇게 됩니다.
| 44byte(buffer+SFP) | + | 도 | + | 개 | + | 걸 | + | 윳 | + | 모 | + | 4byte dummy | + | /bin/sh의 주소| + |"/bin/sh"|

맨 마지막 부분에 "/bin/sh"을 직접 넣어준 이유는 공유라이브러리에서의 주소를 뽑아올 수 없기 때문입니다.

<테스트>
/bin/sh의 주소를 알아보기 위해 printf함수에 break를 걸고 프로그램을 실행시켰습니다.
break.png
break.png (18.01 KiB) Viewed 623 times
마지막 부분에 있는 "BBBB" 문자열 뒤에 "/bin/sh"이 있습니다.
그래서 "/bin/sh"의 주소는 "BBBB"문자열의 시작주소(0xbffffa94)+4 = 0xbffffa98 이 됩니다.
준비물이 모두 갖추어졌습니다.
attack_fail.png
attack_fail.png (9.15 KiB) Viewed 623 times
segmentation fault가 발생해서 core를 살펴봤습니다.
core.png
core.png (12.57 KiB) Viewed 623 times
"/bin/sh"은 0xbffffab8에 있습니다.

/bin/sh의 주소값부분에 0xbffffab4을 대입하여 공격하면 성공합니다.

4.공격
attack.png
attack.png (14.84 KiB) Viewed 623 times
서큐버스의 쉘과 패스워드를 얻었습니다.

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest