[어설픈] 해커스쿨 FTZ level 14문제풀이

2019. 1. 31. 21:49System Hacking/FTZ

안녕하세요!

오늘은 FTZ level 14

문제를 풀어보도록 하겠습니다!


문제를 보니 

아래와 같네요!


main에 

crap선언 되고 스택에 쌓이고

check 선언되고 스택에 쌓이고

char 형의 buf 20byte 선언되고 스택에 쌓이고


fgets로 표준입력으로 45byte받아서 버퍼에 저장하고!

근데 문제는 버퍼 크기가 20인데 여기에 45만큼을

저장하니 오버플로우가 생기겠죠?


근데 지난번 문제와 좀 비슷하긴한데

더 쉬운거 같은데요?

check의 값이 0xdeadbeef이면

알아서 shell이 실행되네요!


Level 13번은 저희가 RTL(Return To Library)

하느라 시스템 함수 주소값이랑 /bin/sh 주소값 

다 넣었어야 했는데 말이죠 ㅎ



자 일단 gdb를 실행시켜서 

attackme를 분석해보니

0x38만큼 할당하네요!

실제로는!


0x38= 56byte만큼이네요!

흠 근데 이건 스택 상황을 보면 


[buf] 20byte

[check] 4byte

[crap] 4byte


총합치면 28byte인데 할당은 56byte만큼 됐고

나머지 28byte가 dummy겠네요!



근데 어디가 정확히 dummy값이고 얼만큼 가야 

check값이 나올지 모르겠어서 

이번에는 직접 문자열을 4byte씩 끊어서

넣었습니다!


paging의 기본 단위가 4byte이기도 하고

원래 메모리가 4byte의 배수로 되어있어서요!


그래서 혹시 몰라서 

그냥 쭈욱 a부터 m까지 

4개씩 아래와 같이 넣고 

gdb에서 실행을 시켰습니다!


그래놓고 아래와 같이 $ebp+0xfffffff0 값을 

string으로 확인했습니다!


자 여기서 질문하시겠죠?

갑자기 이 뚱딴지 같은 $ebp+0xfffffff0값은

왜 확인하는 거냐?

출처가 어디냐?


답은 바로 제가 위에 gdb에서

말씀 안 드리고 넘어갔었는데,

 <main+39> cmpl $0xdeadbeef, 0xfffffff0($ebp)


여기 이 부분에서 compare를 하잖아요!

0xfffffff0+$ebp의 값이 0xdeadbeef와 같은지 !!


0xfffffff0+$ebp에 저희가 넣은 값이 

담겨 있는거에요!


근데 확인해 보니!

아래와 같이 kkkk가 들어가있네요!



a,b,c,d,e,f,g,h,i,j,k

몇번째죠?

11번째가 k죠


즉 40번째까지 j고

41번째부터 44번째까지 k네요!


그러면 뭐 앞에는 a로 채우고

 41번째에서 44번째만 

0xdeadbeef little-endian 방식으로 넣나요?


저는 그냥 그렇게 하기 귀찮아서

\xef\xbe\xad\xde를 11번 총 44개

한꺼번에 넣었습니다


그리고 이걸 attackme의 인자로 넣어주었죠!

이번에도 마찬가지로 ;cat 깜빡하지 마시구요!


아래와 같이 payload을 작성해주시면 

shell이 따지고

비밀번호가 뜨게 됩니다!

고생하셨습니다!