의무적으로 hint를 열어 보니 소스 코드가 나온다.
buf에 40바이트만큼 표준입력으로부터 읽어드린 뒤
buf2와 "go"가 같으면 uid를 변경하여 bash쉘을 실행한다.
3010은 /etc/passwd파일을 보면 level10의 uid인 것을 알 수 있다.
buf는 buf2보다 코드 상에서 늦게 정의 되었으므로 실제 메모리 stack에서 buf2보다 낮은 주소에 위치하게 될 것이다.
fgets()에서 40바이트를 읽어서 buf에 저장한다. buf는 10byte이기 때문에 10보다 큰 데이터를 입력할 경우 overflow가 일어난다.
처음에 10바이트 입력후 overflow가 일어나는 줄 알았지만 찾아보니 쓰레기값이 있다고 한다.
실제 메모리에는 이렇게 들어있다.
##########메모리###############
낮은 주소
---------------------
| 1 |
| 1 |
| 1 |
| 1 | ----> bof[10] (linux는 메모리가 4바이트씩 할당되어 12byte다.)
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
---------------------
| |
| 쓰레기 |
| |
| |
---------------------
| g | -> 우리의 목표
| o |
| |
| | ----> bof2[10] (역시 12byte다.)
| |
| |
| |
| |
| |
| |
---------------------
| |
| 쓰레기 |
| |
| |
---------------------
| |
| 쓰레기 |
| |
| |
--------------------- ----------------> ebp
| |
| sfp |
| |
| |
---------------------
| |
| |
| ret |
| |
---------------------
높은 주소
################################
1을 16개와 go 를 입력하여 overflow가 일어났다.
Good Skill! 과 함께 level10의 쉘을 얻었다. my-pass 하면 끝.
gdb로 까 보면 (level10 권한 필요) buf (ebp-40)와 buf2 (ebp-24) 가 정확히 16 byte 차이가 난다.
## 기본적으로 gdb는 AT&T문법이므로 intel문법으로 변경하고 싶으면
## (gdb) set disassembly-flavor intel 라고 치자.
'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글
[ftz] level11 (0) | 2015.09.20 |
---|---|
[ftz] level10 (0) | 2015.09.18 |
[ftz] level8 (0) | 2015.09.18 |
[ftz] level7 (0) | 2015.09.17 |
[ftz] level6 (0) | 2015.09.17 |