[어설픈] LOB 18번succubus 문제풀이

2019. 4. 12. 09:33System Hacking/[LOB] Hacker School

안녕하세요!

오늘은 LOB 18번 문제

Succubus을 풀어보겠습니다!


소스코드는 아래와 같습니다!


argv[ ]형식으로 인자 전달 받구요!

buffer[40] 할당하구요

char형 포인터 addr 할당하구요

argument 2개보다 작으면 안되구요!


addr 포인터에 strcpy함수 주소 넣어서

만약 main 함수의 ret_address에 strcpy가 아니면

무조건 exit( ) = 무조건 strcpy로 return해서 문제풀어라!


그리고 제일 짜증나는 부분인!

buffer+48부터 4byte를 AAAA로 초기화합니다

왜 짜증이 나냐?


AAAA부분은 strcpy의 return address인데

return address를 AAAA로 고정시켜놨어요.....




자 그러면 strcpy를 이용해서 

어떻게 문제를 풀까 생각을 해야겠죠?

strcpy는 문자열 복사하는 함수인데..


뭐 주어진 조건을 보면 제일 먼저 떠오르는 것은!

AAAA로 고정시켜 놓은 부분을 다른 곳의 주소로 

overwrite 하면 되겠죠?


저희가 shellcode를 메모리에 삽입하고

그 주소 값을 AAAA위치에 넣으면

ret을 쉘코드로 하겠죠?


여기서 주의해야 할 부분이 있는데!

제가 곧 설명해드릴게요!


우선 strcpy의 주소를 찾아야죠!

그건 gdb로 까서 보면

바로 아래와 같이

call 0x08048410 <strcpy>

주소값이 떡하니 나오네요!

 



자 이걸 토대로 미완성인 payload를 만들었는데!

여기서 이제 제가 말한 주의해야 할 부분이 나옵니다!


payload를 보면 

더미 44+ 0x08048410 strcpy 주소+ bbbb(AAAA fix 부분, 어차피 AAAA로 바뀜)+ strcpy 첫 번째 인자 + strcpy 두 번째 인자+ shellcode주소+ \x90*10+ 쉘코드 25byte


여기서 궁금하실 수 있는 부분이!

엥? shellcode주소를 갑자기 넣는다고?

그냥 strcpy(destination,source) 이것만 실행시키면 끝 아님?

라고 생각 하실까봐 !


shellcode주소 넣은 이유를 설명해드리겠습니다!



자 위에 같이 미완성 payload를

입력하고 gdb에서 실행시켜보면!


아래와 같이 stack 상황을 확인할 수 있습니다!

여기서 0x41414141부분이 AAAA이기 때문에 

AAAA의 주소는 0xbffffaa0입니다!


shellcode가 시작하는 부분은 

0x90909090이 처음으로 나오는

0x41414141 바로 밑에층인!

0xbffffab0입니다!



물론 여기서는 제가 strcpy의 첫 번째 인자와 두 번째 인자값을 잘못썼습니다

0xbffffa9c, 0xbffffaac로 말이죠 ㅠㅠ



근데 제대로 적고 실행을 시키면 

아래와 같이 core파일이 생겨서 

열어보면 0x90909090 in ??

이렇게 뜹니다!


이게 무슨 말이냐면 ret_address에 shellcode의 주소가 아닌!

0x90909090이 복사됐다는 뜻이에요!


그래서 0x90909090주소로 가려고 하는데

"여기가 어디냐... 장난치냐??"

라고 프로그램이 말하는 겁니다


여기서 이제 제가 말한 shellcode의 주소를 

왜 따로 입력해줘야 하는지 알려드리겠습니다!


그 이유는 바로!

strcpy 할 때 0x90909090이 아닌!

shellcode의 주소를 복사해야하기 때문입니다!


strcpy의 경우 strcpy(char *dest, char *src ) 형식으로 되어있죠?

dest와 src에 주소 값을 넣으면

그 주소 값에 있는 값을 가져오는거죠?


여기서 src에 쉘코드의 주소를 바로 넣어버리면!

쉘코드 앞에 있는 only \x90909090을 복사해서!

AAAA 자리에 overwrite하는거에요!


그래서 쉘코드의 주소값을 저장하고 있는 메모리 주소를 넣어야! 

(= 더블포인터)

쉘코드의 주소를 담고 있는 주소 -----> 쉘코드를 담고있는 주소 ---> 쉘코드!

 


자 그럼 우선 쉘코드의 주소부터 파악해 볼까요?

아래와 같이 제가 미완성 페이로드를 gdb에 넣고

breakpoint를 걸고

쉘코드의 위치인

0xbffffaaa를 찾았습니다!


그래서 위의 사실을 토대로

shellcode 주소 위치에 0xbffffaaa를 넣고!

(payload에서 이것만 바꿨어요 일단은!)

실행을 시키면!


제가 위에서 엄청 강조한

shellcode의 주소를 담고있는 놈의 주소!

0xbffffa9c가 있구요!

(=strcpy 2번 째 인자) 


저희는 이제 마지막으로 strcpy 첫 번째 인자를

찾아야 합니다!


ebp에서 바로 +8하면

0x41414141 보이시나요?

저게 AAAA죠?




그래서 ebp인 0xbffffa88에서

+8을 하니

0xbffffa90이 나오네요!

저희가 덮어쓸 주소가 나왔습니다! 



그래서 저희가 최종적으로 기다리고 기다리던 

payload입니다!


더미 44개 + strcpy 함수 주소 + bbbb(AAAA) + strcpy 첫 번째 인자 + strcpy 두 번째 인자+ shellcode 주소+ \x90*10+ 25byte 쉘코드!


이렇게 하면 아래와 같이 exploit가 완성이 됩니다!

고생하셨습니다!