Wargame/FTZ

[FTZ]level17

D4tai1 2019. 9. 8.

아침이 밝았습니다.

 

깔끔하게 정신상태로

memset()하고 

 

시작해볼까요?

 

[그림1] hint 파일 확인

보니까 level16과 비슷한 것도 같은데..?

 

shell함수가 보이지 않네요!!

 

뭔가 막힌 느낌이네요.

 

우리가 level11에서는

변수에 shellcode를 삽입하고

그 주소를 리턴주소로 변조했습니다.

 

스택 내에 변수가 사이즈가 안나오니

우리는 환경변수를 이용해 봅시다.

 

그럼 환경변수란?

위키백과 왈 "  프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는, 동적인 값들의 모임이다."

라고 합니다.

 

조금 요약해보면

변수는 특정 프로그램에서

데이터를 메모리에 저장해 놓고 쓰지요?

 

그러나 여러 프로그램이 그 데이터에 

쉽게 접근(참조)을 하게 하려면 

환경변수를 사용합니다.

 

[그림2] gdb로 확인

헛.. 막상 열어보니

우리가 만든 shellcode는 

25바이트고...

 

buf의 주소는 ebp-56

함수포인터의 주소는 ebp-16

 

공간이 40바이트나 있네요?

 

그래도 환경변수를 사용해 봅시다.

 

payload는...

buf[20] + dummy[20] + call[4]

정도로 구성하면 될 듯 싶네요.

 

[그림3] 환경변수 추가 및 확인

 

export를 사용해서

SHELLCODE라는 변수를 할당했습니다.

 

env를 이용해서 잘 들어갔는지도 확인했습니다.

 

이제 

공격코드를 만들러 갑시다.

 

지금 필요한 것은?

덮어 씌울 환경변수의 주소지요!!

 

[그림4] /tmp/get_env.c

 

[그림5] 환경변수 SHELLCODE의 주소

 

환경변수의 주소는

0xbffffc34입니다.

 

import os
import struct

p32 = lambda x:struct.pack('<L', x)

call_addr = 0xbffffc34

payload = 'A'*40
payload += p32(call_addr)

print payload

 

40바이트를 A로 채우고 call부분을 

덮어씌웠습니다.

 

[그림6] 공격스크립트를 이용한 공격

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

안됩니다..

 

환경변수를 너무 하드하게 넣어주어서 그런가..?

 

그렇다면

조금 유연하게 넣어봅시다.

 

[그림7] 환경변수 수정

NOP Sled기법으로 

주소가 정확하지 않고 살짝 변화가 있더라도

유연하게 동작할 수 있도록

 

빨간박스에 있는 것과 같이

'\x90'*100을 추가해주었습니다.

 

Level18 Password is "why did you do it".

'Wargame > FTZ' 카테고리의 다른 글

[FTZ]level19  (0) 2019.09.08
[FTZ]level18  (0) 2019.09.08
[FTZ]level16  (0) 2019.09.08
[FTZ]level15  (0) 2019.09.08
[FTZ]level14  (0) 2019.09.08

댓글