이번엔 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:0x8049698, 0x28, 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 |