2019. 1. 31. 21:49ㆍSystem 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이 따지고
비밀번호가 뜨게 됩니다!
고생하셨습니다!
'System Hacking > FTZ' 카테고리의 다른 글
[어설픈] 해커스쿨 FTZ Level 16 문제풀이 (0) | 2019.02.05 |
---|---|
[어설픈] 해커스쿨 FTZ level 15 문제풀이 (0) | 2019.02.03 |
[어설픈] FTZ 해커스쿨 Level 13문제풀이 (0) | 2019.01.28 |
[어설픈] 해커스쿨 FTZ level 12 문제풀이 (0) | 2019.01.24 |
[어설픈] 해커스쿨 FTZ level 11 문제풀이 (0) | 2019.01.22 |