看到程序先例行检查一下

bjdctf_2020_babyrop2(没有成功拿到shell)_字符串

 

 可以看到开启了canary和nx保护,需要注意的是这个acnary

将程序放入ida中shift+f12

bjdctf_2020_babyrop2(没有成功拿到shell)_d3_02

 

 

没有关键性函数。我们进入main函数中

在main的gift程序里面我们可以看到明显的格式字符串漏洞,printf没有进行限定输入,所以我们可以通过这个程序获取到canary的值

bjdctf_2020_babyrop2(没有成功拿到shell)_main函数_03

 

 我们进入程序试验一下,发现当第六个偏移的时候出现了61(%6是查看第6个,$p是以指针形式显示)

bjdctf_2020_babyrop2(没有成功拿到shell)_字符串_04

 

 我们可以设置一下断点,stack查看栈

 

bjdctf_2020_babyrop2(没有成功拿到shell)_main函数_05

 

 可以看到df38的位置就是canary的值,所以我们可以通过输入 %7$p 获取到canary的值

查看vuln函数

 

bjdctf_2020_babyrop2(没有成功拿到shell)_main函数_06

 

 read允许的0x64远远大于buf的0x20,所以我们可以在这里泄露libc版本拿到shell

完整exp如下

 

bjdctf_2020_babyrop2(没有成功拿到shell)_d3_07

 

 但是不知道为什么远程总是不能成功获取到shell

bjdctf_2020_babyrop2(没有成功拿到shell)_字符串_08

 

 也在payload3加上了ret的地址,让其栈对齐但是还是获取不到shell,希望有懂得师傅教导一下!

结束