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 * |