LOB - nightmare -> xavius

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

Moderator: amesianx

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

LOB - nightmare -> xavius

Post by KSH » Fri Aug 12, 2016 3:14 pm

악몽을 잡아봅시다.
1.홈 디렉터리
1.png
1.png (4.39 KiB) Viewed 518 times
2.소스코드
소스_1.png
소스_1.png (12.13 KiB) Viewed 518 times
소스_2.png
소스_2.png (17.7 KiB) Viewed 518 times
소스가 길어졌습니다. 이 프로그램은 이전과 마찬가지로 40byte char형 배열 buffer와 포인터 ret_addr을 선언합니다.
그리고 메인함수의 인자를 이용한 것이아닌 fgets함수로 표준 입력 스트림을 통해서 buffer에 256byte만큼의 문자열을 입력합니다.
그리고 리턴주소가 \xbf , \x08 일 때 종료합니다.
그러고 나서 ret_addr에 buffer+44 지점에서 4byte만큼 주소를 복사합니다.

리턴에 \xc9 (hex코드로 leave)가 입력되어 있는지 확인하여 Fake EBP기법을 체크합니다.
리턴에 \xc3 (hex코드로 ret)가 입력되어 있는지 확인하여 ret sled기법을 체크합니다. 이러한 두가지 기법이 사용됬다면
종료해버립니다...

그 뿐만 아니라 buffer의 시작점부터 sfp까지 전부 0으로 휩쓸어버리고,
buffer+48지점인 리턴주소 이후부터 전부 0으로 만들어버립니다.
마지막으로 buffer-3000지점부터 전부다 0으로 만들어 공유라이브러리조차 사용할 수 없게 합니다.

이 문제의 힌트는 fgets()에 있습니다. 이 함수는 입력받은 문자열을 stdin버퍼에 보관합니다.
stdin버퍼의 시작주소를 알아내어 리턴주소를 stdin버퍼의 시작주소로 변경한다면 문제를 풀 수 있게 되는거죠

3.분석
disas_main.png
disas_main.png (10.84 KiB) Viewed 518 times
소스코드를 보면 fgets(buffer, 256, stdin); 가 있습니다.
fgets함수를 호출하기 위해 스택에는 stdin -> 0x100 -> buffer(ebp-28) 순서대로 푸쉬가 될겁니다.
즉 함수프롤로그 직후인 main+6지점, 0x08049a3c가 stdin의 주소가 됩니다.

stdin을 확인해 보기 위해 main+26 (fgets함수를 호출한 직후) 부분에 브레이크를 걸고 프로그램을 실행했습니다.
stdaddr.png
stdaddr.png (4.57 KiB) Viewed 518 times
stdin의 주소는 0x401068c0 이라고 나오네요
0x401068c0을 자세히 살펴보았습니다.
stdin.png
stdin.png (7.53 KiB) Viewed 518 times
stdin buffer의 주소는 0x40015000입니다.

따라서 페이로드는 | 쉘코드 | + | \x00\x50\x01\x40 (stdin) | 이 됩니다.
리턴주소로 \x08도 \xbf도 사용할 수 없지만 \x40은 사용할 수 있기 때문에 문제를 풀 수 있습니다.

4.공격
exploit.png
exploit.png (7 KiB) Viewed 518 times
NOP 19 + 25byte 쉘코드 + stdin주소 를 사용하여 공격을 수행하였습니다.
attack.png
attack.png (7.1 KiB) Viewed 518 times
xavius의 쉘과 패스워드를 얻었습니다.

Post Reply

Who is online

Users browsing this forum: No registered users and 4 guests