[어설픈] LOB 4번 goblin 문제풀이

2019. 3. 15. 22:44System Hacking/[LOB] Hacker School

안녕하세요! 

오늘은 LOB 4번

goblin 문제풀이를 해보도록 할게요!


아래와 같이 일단 소스가 있습니다!

직전 문제 cobolt에 비해서

꽤 기네요! 


하나씩 천천히 살펴볼게요!


1) argv 형식으로 입력받음


2) 스택에 buffer 40크기, int형 i 변수가 있구요!


3) argument가 2개보다 작으면 오류라고 에러 메세지 출력!


4) 여기서 egghunter라고 하는건! 환경변수를 못쓰게 한거에요!

왜냐면 코드를 보면 environ[i] 이 부분이 환경변수를 가리키는 건데

memset 함수로 environ[i] 값을 모두 0으로 설정하잖아요!


5) 여기도 추가된 부분인데 

argv[1][47] != '\bf'

배열에서 47이면 실제론 48이죠?

(배열의 index가 0부터 시작하니까요)


즉, argv[1]에서 48번째 값이 \xbf이여야 한다!


굳이 \xbf로 설정한 이유는 stack으로 리턴하라고 알려주는거에요!

이 문제에서는 스택이 \xbf 값으로 시작하거든요!


그래서 \xbf가 아닌 다른곳으로 리턴하려고 하면

"스택은 아직 너의 친구야!" = 친구야, 스택으로 리턴하렴^^


그리고 이제 취약점이 있네요!

strcpy에서 argv[1]을 복사하는데

얼만큼 복사하는지 크기 지정이 안돼서

오버 플로우 발생!


 


혹시라도 argv[1][47]값이 \xbf가 아니면

어떻게 되는지 궁금해 하실 분들을 위해


제가 직접 아래와 같이 3번 cobolt 문제풀이와 비슷하게

이 문제를 rtl로 풀어보려고 코드를 짜봤습니다!


라이브러리에 있는 system함수 호출하고 

ebp+8위치에 /bin/sh 문자열 위치를 인자로 주었습니다! 

( 이해 안가시면 3번 문제 보세요 :) )


그랬더니 stack is still your friend

아직 스택은 니 친구라면서 친구를 잘 활용하라고

친절하게 알려주네요 ㅎ


우선 이렇게 gdb를 실행시켰습니다!

다음으로 strcpy가 실행되고

바로 stop 시켜서 스택 상황을 보도록 하겠습니다!


왜냐면 스택상황을 보고 

저희가 입력한 값들이 어디에 들어갔는지 찾아야

거기로 return 하니까요!



일단은 아래와 같이  

a를 45개 넣어주고

46, 47, 48, 49 번째 값을 

모두 \xbf로 해놨습니다!


스택은 저희 친구니까요 :)




여기서 저는 esp값을 확인해서 파악했는데

ret에 breakpoint 걸어서 

return address 값 알 수도 있어요!


여기서 보면!

61616161 이렇게 시작하는 구간이 있죠?

저희가 입력한 a에요!

(0x61= a)

 


좀 더 이쁘게 정리하려고!

$esp+12를 하니

저희가 입력해야 하는

주소가 떳죠?

0xbffffaa0 여기에 

nop값과 shellcode를 넣으면 되겠죠?





그래서 아래와 같이 exploit 코드를 작성했습니다!


shellcode 25byte + nop 19byte + 리턴 주소 4byte


제가 여러번 시도했는데!

이 문제는 쉘코드를 앞에 넣고

nop을 뒤에 넣어야 

쉘이 잘 따지더라구요!


그랬더니!

아래와 같이 비밀번호가 떴죠?

고생하셨습니다!