0x1
这题本来一点思路都没有,然后看到别人说的read_int可以是负数啊,这样就可以往任意地址写内容了~我们往GOT中写入我们的shellcode的地址,然后再去调用被覆盖的函数。
0x02
但是关键是shellcode的编写。输入会被一个叫is_printable()的函数过滤,函数原型如下。
这里虽然是s[i] <= 31 以及 s[i] == 0x7F 这两个条件会被过滤,但是在实际的shellcode调试中发现,s[i] <= 31 这个东西里面大有名堂,在汇编里面这个条件判别是这样的
然后我就发现s[i] = 0x8f,0xf7等等都是无法满足这个条件的,然后去一查:这个cmp是有符号数的compare,所以al=(1XXXXXXX)b都是负数。。。那么自然是小于0x1F的,所以我们可以使用shellcode字符只有 0x20 < s[i] < 0x7E,另外就是这题限制了shellcode的长度。无奈汇编能力只能看看代码,而且接触机器码又是少之又少的,所以这个题目搁置了好久。跑去打pwnable.kr,然而今天kr访问不上去了~又拾起此题。
在网上找到这位仁兄的整理:pzhxbz的博客
首先整理一下在可打印范围内能用的汇编指令:
我自己也找到了一份asm转machine-code 的资料
然而太多太杂,一时间看不完而且不好找。