【逆向学习记录】学习《一步一步学ROP_x64》

本文记录了学习《一步一步学ROP_x64》的过程,探讨了x86与x64的主要区别,如内存地址范围扩大和函数参数传递方式变化。通过调试实践level3和level4,解释了如何构造payload以利用漏洞,包括修改返回地址为调用system函数。总结中提到了在x64下遇到0x00导致的地址泄露问题以及栈迁移的必要性。
摘要由CSDN通过智能技术生成

1.概述

通过前面几篇文章,基本上搞定了x86的漏洞原理,针对x64的还需要进一步学习,依然利用最经典的当属蒸米大神的一步一步教学系列
一步一步学ROP之linux_x64篇 – 蒸米
环境:ubuntu 16.04

2.linux x86与x64的区别

这里引用一下上面文章中的语言:
linux_64与linux_86的区别主要有两点:
1.首先是内存地址的范围由32位变成了64位。但是可以使用的内存地址不能大于0x00007fffffffffff,否则会抛出异常。
2.其次是函数参数的传递方式发生了改变,x86中参数都是保存在栈上,但在x64中的前六个参数依次保存在RDI, RSI, RDX, RCX, R8和 R9中,如果还有更多的参数的话才会保存在栈上。
所以其栈帧及传参的变化为之前一篇文章讨论的那样子
x64位栈帧与传参

3.调试实践level3

3.1 源代码(引用源码)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void callsystem()
{
   
    system("/bin/sh");
}

void vulnerable_function() {
   
    char buf[128];
    read(STDIN_FILENO, buf, 512);
}

int main(int argc, char** argv) {
   
    write(STDOUT_FILENO, "Hello, World\n", 13);
    vulnerable_function();
}

编译的时候,关闭栈保护:

gcc -fno-stack-protector level3.c -o level3

3.2 反汇编代码

0x00000000004005e8 <+0>:     push   rbp
0x00000000004005e9 <+1>:     mov    rbp,rsp
0x00000000004005ec <+4>:     sub    rsp,0x10
0x00000000004005f0 <+8>:     mov    DWORD PTR [rbp-0x4],edi
0x00000000004005f3 <+11>:    mov    QWORD PTR [rbp-0x10],rsi
0x00000000004005f7 <+15>:    mov    edx,0xd
0x00000000004005fc <+20>:    mov    esi,0x4006ac
0x0000000000400601 <+25>:    mov    edi,0x1
0x0000000000400606 <+30>:    call   0x400470 <write@plt>
0x000000000040060b <+35>:    mov    eax,0x0
0x0000000000400610 <+40>:    call   0x4005c7 <vulnerable_function>
    0x00000000004005c7 <+0>:     push   rbp
    0x00000000004005c8 <+1>:     mov    rbp,rsp
    0x00000000004005cb <+4>:     add    rsp,0xffffffffffffff80
    0x00000000004005cf <+8>:     lea    rax,[rbp-0x80]
    0x00000000004005d3 <+12>:    mov    edx,0x200
    0x00000000004005d8 <+17>:    mov    rsi,rax
    0x00000000004005db <+20>:    mov    edi,0x0
    0x00000000004005e0 <+25>:    call   0x400490 <read&#
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值