본문 바로가기

[Pwnable] 해커스쿨 FTZ

[해커스쿨 FTZ] Level9

이번엔 level9을 풀어보자.

로그인을 하고, 파일 목록을 확인하고, 힌트를 확인한다.

 

이번 문제의 힌트는 아래와 같다.

이번 문제는 Buffer of Flow에 관련된 문제 인 것 같다.

 

buf2, buf 에 10바이트만큼 할당하고, buf2의 공간에 " go " 라는 문자열이 들어가 있으면 문제는 풀린다.

 

버퍼의 크기를 10으로 설정 해놨는데 40 만큼의 데이터를 받으면서 버퍼오버플로우의 취약점이 생긴다.

 

정확한 분석을 위해 /tmp 디렉으로 이동해 bof.c 라는 이름으로 힌트의 코드를 복사한다.

그리고 bof 라는 이름으로 새롭게 컴파일 한다.

                                                      ( gcc -o bof bof.c)

 

gdb 를 이용해서 정확한 분석을 해 보자

                                                      ( gdb -q bof )

                                            ( set disassembly-flavor intel )

                                                       ( disas main )

노란색으로 표시 되어있는 부분이 각각 buf와 buf2 의 시작점이다.

그 이유를 간단히 설명하자면

 

위 그림과 같이 코드에서 fgets 함수를 호출하기 전, 3가지 인자값을 push 한다. 

순서대로 push   ds:0x8049698,  push  0x28,  push   eax(ebp-40)  인데

스택에 push 할때에는 소스코드의 순서의 역순으로 보내기 때문에 

 

                                 fgets( buf,    40,    stdin);

               

                           ds:0x80496980x28,   eax(ebp-40)

 

위와 같이 색깔 별로 짝이 지어지게 된다.

 

마찬가지로

                                  strncmp( buf2,   "go",     2 )

 

                                         0x2      0x804856     eax(ebp-24)

정리하자면, 

<main+43> : lea    eax, [ebp-40]   => buf

<main+65> : lea    eax, [ebp-24]   => buf2

가 되고, 둘의 차이는 16바이트 이다.

 

따라서 16바이트를 채우면 buf2의 영역에 들어가게 되고 거기에 "go" 를 입력하면 될 것이다.

 

level 10 암호 : interesting to hack!

 

 

'[Pwnable] 해커스쿨 FTZ' 카테고리의 다른 글

[해커스쿨 FTZ] Level11  (0) 2020.03.12
[해커스쿨 FTZ] Level10  (0) 2020.03.04
[해커스쿨 FTZ] Level8  (0) 2020.03.02
[해커스쿨 FTZ] Level7  (0) 2020.03.02
[해커스쿨 FTZ] Level6  (0) 2020.03.02