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

2019. 2. 3. 23:47System Hacking/FTZ



안녕하세요!

오늘은 FTZ Level 15번을

풀어보도록 하겠습니다!


문제의 코드는 아래와 같습니다!

근데 뭐 레벨 14의 코드와

매우 흡사하죠?


Level 14의 코드와 달라진 부분이 

사실 딱 두 군데입니다!

1) check가 포인터 변수로 바뀐 것!

2) if(*check==0xdeadbeef)로 바뀐 것!


포인터 변수는 쉽게 말해서

다른 놈에게 손가락질 할 수 있는 변수에요!

똑같이 변수인데, 한 가지 기능이 추가된 거에요!

 

예를 들자면, check에 주소 값을 넣고(예를 들어 0xbfffea1d)

*check=1을 하면 

check 변수에 1을 넣는게(check=1) 아니라

check 변수가 가지고 있는

 주소 값을 따라가서 1을 넣는 거에요!


위의 예에선 check가

 0xbfffea1d 주소 값을 가지고 있죠?

그럼 0xbfffea1d 주소 값에 1을 넣는거에요!


즉 이번의 경우 포인터 변수 check가 

손가락질(가리키는)하는 곳의 값이

0xdeadbeef면 문제가 풀리는 거에요!


흠.. 근데 여기서 문제는

과연 0xdeadbeef의 값을 가지고 있는

주소 값을 어떻게 찾느냐가 문제입니다!


0xdeadbeef의 값을 가지고 있는 주소값만 알면

포인터 변수에게 

"야 저 주소값 가리키면 0xdeadbeef 나와"

라고 말해줄 수 있는데 말이죠


일단 gdb를 켜서 분석을 해보도록 하겠습니다!


흠..

상황을 보니 여기서도 

Level 14와 같게 0xdeadbeef와 같은지 

비교하는 부분이 있네요!


0x080484b0<main+32>: cmpl $0xdeadbeef,(%eax)

이 부분이요!

이걸 지켜보다가 

이러한 생각이 들었습니다!


compare(cmpl)할 때

0xdeadbeef인지 아닌지 확인하려면

1. 0xdeadbeef가 메모리 어딘가에는 저장되어야 하고

2. 그 값일 불러와서 내가 입력한 값이랑 비교하겠구나!


가령 제가 갖고 온 물건이 

진품인지 아닌지 판별하려면

전문가가 직접 진품을 준비해와서

제가 가져온 물건이랑 전문가가 가져온 진품이랑 비교를 할 꺼 아니에요?


그럼 이 문제에서는 0xdeadbeef를

메모리 분명히 어딘가에 감췄을텐데 

어디일까?


그러다가 

0x080484b0<main+32>: cmpl $0xdeadbeef,(%eax)

이 부분을 좀 더 파헤치기로 결심했습니다!


그래서 아래와 같이 0x080484b0을 좀 더 자세히

보고자 스택을 확인했습니다!


그랬더니! dead와 beef가

떨어진게 보이네요!


음 그러면 좀 빼보면 합쳐지지 않을까?

그랬더니 합쳐졌는데 더 뒤로 가서

좀 더 깔끔하게 하고자

좀 더했더니 바로 0xdeadbeef가

뜨는군요!


주소값은 0x080484b2!

  

근데 이제 버퍼를

얼만큼 채워야 하냐?

이걸 알아야 겠죠?


그래서 gdb에서 breakpoint를

main+42에 걸었습니다!

어디냐면, compare 하기직전에

breakpoint로 stop시킨 거에요


그리고 a를 40개 넣고 그 뒤로

알파벳 순서대로 4개씩 넣었습니다!


그리고 eax값과 $0xdeadbeef가 비교하길래

아 eax에 우리가 입력한 값이 들어가 있겠구나!

해서 eax 레지스터의 값을 확인해 보니!

0x62626262가 있네요!


62는 아스키코드로 b이니!

41~44번째까지가 check의 공간이군!


그래서 바로 아래와 같이 44번째까지 

0x080484b2를 11번 입력했습니다!

;cat도 까먹지 않았구요!



그랬더니 아래와 같이

문제가 풀리고

비밀번호가 나오네요!


고생하셨습니다!