[攻防世界]进阶区Mary_Morton
进阶区另一个比较简单的题,没太多弯弯绕绕
还是先查看文件
看可利用的字符串
发现system和cat flag已经组合好了,就在sub_4008DA函数里,只要跳转到这个而函数即可拿到flag
看伪代码可以发现两个漏洞
第一个是溢出漏洞
第二个是格式化字符串漏洞
由于这个程序开了canary,所以没法直接栈溢出,即单纯使用栈溢出不可行,而单纯利用格式化字符串漏洞也没法跳转到sub_4008DA函数,所以需要配合使用
先利用格式化字符串漏洞泄露canary值,再用栈溢出跳转到目的函数
先计算到canary的偏移:
到输入位置,即61616161的偏移是6,而buf到canary的距离是(0x90-0x8),即0x88,8位为1字节,所以偏移是(0x88) / 8,即17,所以输入到canary的偏移就是6+17=23
之后用%23$p接收canary值,用得到的canary值栈溢出,跳转到sub_4008DA即可
思路:
1 | from pwn import * |
payload解释:
- ‘a’*136:buf到canary的距离,0x88即136
- p64(canary):之前泄露得到的canary的值
- ‘a’*8:用于覆盖canary和ret之间的ebp
- p64(0x4008DA):函数sub_4008DA的地址