2017湖湘杯pwn200,还是比较经典的格式化字符串例题
先查看一下保护机制:
32位开启了canary和堆栈不可执行到IDA看一下主函数源码
在sub_80485CD函数可以看到输入的数据直接进入了printf函数中,这个肯定是一个格式化字符串漏洞,进去看一下
比较经典的利用方式,通过while循环多次利用,仔细看一下循环过程
形如:char str[100];
scarf("%s",str);
printf(str)
查看本机ASLR
ldd 'which col' 查看,确定本机开启了aslr,sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space"关闭ASLR
利用思路:
看到printf(&buf)之后
read(buf)
atoi(buf)
》1利用格式化字符串漏洞的任意地址读,先泄露出puts函数的地址puts_addr。
》2利用格式化字符串漏洞的任意地址写,去将atoi函数在got.plt表中的地址改为system函数的地址,
》3通过read控制buf,传入”/bin/sh”,构造出system(“bin/sh”),获取shell。
0X00泄露puts函数地址
第六个参数,也就是格式化字符串函数的第七个参数
计算system地址libc.symbols['system'] - libc.symbols['puts'] + u32(puts_addr)
00X01将atoi函数在got.plt表中的地址改为system函数的地址,
原理:
printf("abc%nabc\n", &val);
printf("val = %d\n", val);
利用%n //不输出字符,吧已经输入的字符变量写入对应整形指针参数所至变量。
已经调试过了"AAAA"就在第7个参数,构造{addr}{适当的写入值}{%7$n}即可。
pwntools提供了fmtstr_payload函数来自动生成格式化串。
fmtstr_payload(参数偏移,{xxx_got_addr: system_addr})
0X02讲bin/sh写入system
exp exp运行结果
网友评论