Wargame/FTZ

[FTZ]level15

D4tai1 2019. 9. 8.

시간이 늦었고

오늘은 태풍도 스쳐지나갔고

달은 떴고 잠은 자야하지만!!

 

이대로 자버리면

꿈에서 아쉬워할 나?를 위해

level15까지만

해결하고 자려고 합니다.

 

시작해 볼까요?

 

[그림1] hint 파일 확인

엇!!!!

이거 level14에서 본거 아닌가요?

 

눈을 뜨고 다시 보니

6라인을 보니 canary가 주소로 되어있네요.

 

이걸 해결하는 방법은 2가지정도로 추측됩니다.

1) check가 가리키는 주소(canary)의 값을 0xdeadbeef로 변경하거나

2) check가 가리키는 주소(canary)를 0xdeadbeef가 있는 곳으로 변경하거나

입니다.

 

현실적으로 canary가 가리키는 곳에 접근을 하기가 더 힘드므로

check가 가리키는 주소를 변경해볼까 합니다.

 

[그림2] gdb로 디스어셈블한 코드확인

level14와 동일하게

 

main+17에서

ebp-56이 buf의 시작주소이고,

ebp-16이 check의 주소로 보이네요.

 

비교하기 전인

main+29 주소에 breakpoint를 걸고

실행해 봅시다.

 

[그림3] "r AAAA"로 실행후 ebp확인

ebp의 주소는 0xbfffec68이네요

 

그림을 그려봅시다.

 

[그림4] stack 상태

이와 같은 상태라면 

0xbfffec54에 0xdeadbeef를 넣고

0xbfffec58이 0xbfffec54를 가리키도록하면

적절할 듯 싶습니다.

 

어떻게 공격코드를 만들어야 할까요?

[그림5] 공격코드 작성방법

공격의 성공률을 올리기 위해

buf(20)와 dummy(20)을

모두 0xdeadbeef로

(4바이트*10개 = 40바이트)

채웠습니다.

 

이후 buf의 시작지점을 가리키도록

0xbfffec30으로 덮어씌웁니다.

 

즉, 0xdeadbeef*10 + 0xbfffec30

이렇게 작성하면 됩니다.

 

공격코드를 작성하러 갑시다.

 

import os
import struct

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

check = 0xbfffec30
canary = 0xdeadbeef

payload = p32(canary)*10
payload += p32(check)

print payload

 

이대로 실행하면?

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

주소가 계속 바뀌는 탓에

여러번 시도 후에 성공했네요.

 

[그림7] clear

Level16 Password is "about to cause mass".

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

[FTZ]level17  (0) 2019.09.08
[FTZ]level16  (0) 2019.09.08
[FTZ]level14  (0) 2019.09.08
[FTZ]level13  (0) 2019.09.07
[FTZ]level12  (0) 2019.09.07

댓글