Pwnable.tw dubblesort
最近总是想写点东西,想来想去还是pwnable.tw上的题目值得记录,因此准备写个series,就从200分的dubblesort开始吧😝
32位的程序,题目名是dubblesort冒泡排序,先分析一波:
1 | __printf_chk(1, (int)"What your name :"); |
开始的name输入到stack上,read没有’\0’截断,因此可用来泄露栈里的数据,多为libc。
之后程序让我们输入sort number和number,这些数据都是存放在stack上的,然后执行sort()函数进行冒泡排序。
1 | __printf_chk(1, (int)"Hello %s,How many numbers do you what to sort :"); |
由于输入的数量由我们控制,那就可以栈溢出了,难点在于程序开启了canary,因此我们要做的就是如何能够不改掉canary同时覆盖返回地址,并且在sort()后这些数据还能再对应的位置上(可能因为大小问题而被交换之类的)📍
在执行__isoc99_scanf(“%u”, v4);时,当我尝试输入一些非法的字符如’#’,由于”%u”表示接收数据格式为无符号的整形,因此视’#’为非法的字符,从而scanf执行失败,栈上对应的数据没有被修改,但也导致它留在了stdin里使得后面循环的scanf也无法正确执行,那有没有什么字符可以使得scanf视其为合法字符却不修改stack的数据呢?
网上查找一番了解到’+’和’-‘可以🎉。原因在于这两个符号用于定义正数和负数,当输入+4时会视为4,-4会视为无符号的0x100000000-4,因此当我们只输入’+’时,由于我们实际上什么也没输入,自然也就不会改写stack上的数据。
因此我们可以在canary前写入’0’,canary处写入’+’,cananry后面到ebp写str(0xf0000000),ret_addr写system,然后写两个libc中’/bin/sh’的地址,这样构造的话sort()完其位置将不会因交换而改变(没有发生交换),从而能拿到flag🚩
EXP:
1 | from pwn import * |