格式化字符串pwn200

2020-02-27  本文已影响0人  Hexad

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运行结果
上一篇下一篇

猜你喜欢

热点阅读