0x00 前言
一道基础的栈溢出,开启了pie和canary
0x01 分析
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
- 它要排序的数字的数量没有限制,因此可以造成栈溢出。
__printf_chk(1, (int)"Hello %s,How many numbers do you what to sort :");可以泄露出栈上的内容
我原来是想用%s来泄露canary的,但是这样就没法泄露libc了,那么怎么绕过canary呢?这里就要用到scanf的一个小技巧。
如果直接输入非法字符的话,由于程序没有对输入流进行清空,所以之后的scanf也都会是非法字符,也就是意味着后面的输入全部无效,但是输入+或者-时是被当成一次有效输入,由于我们仅仅输入+或者-并不能直接获得一个有效数值,所以本次scanf也作为无效看待,这样就能保证stack guard不会被修改,当进行下一次scanf的时候,识别到输入流不完整也会继续I/o中断等待输入。
0x02 exp
1 | from pwn import * |