逆向-attack之改写函数的返回地址

news2024/12/24 3:19:10

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

/*
 * 改写input()函数的返回地址,从而使得breakout()函数在没有直接调用的情况下获得执行
 */

void breakout()
{
    puts("Welcome. Have a shell...");
    system("/bin/sh");
}

void input()
{
    void *p;
    printf("Address of stack variable: %p\n", &p);
    printf("Something that looks like a return address on stack: %p\n", *((&p)+2));
    // Let's change it to point to the start of our sneaky function.
    *((&p)+2) = breakout;
}

int main()
{
    printf("main() code starts at %p\n",main);
    
    input();
    while (1) {
        puts("Hello");
        sleep(1);
    }

    return 0;
}

 

#if 0
/*
 * intel
 */

00000000000011c9 <breakout>:
    11c9:    f3 0f 1e fa              endbr64
    11cd:    55                       push   %rbp
    11ce:    48 89 e5                 mov    %rsp,%rbp
    11d1:    48 8d 3d 30 0e 00 00     lea    0xe30(%rip),%rdi        # 2008 <_IO_stdin_used+0x8>
    11d8:    e8 b3 fe ff ff           callq  1090 <puts@plt>      // puts
    11dd:    48 8d 3d 3d 0e 00 00     lea    0xe3d(%rip),%rdi        # 2021 <_IO_stdin_used+0x21>
    11e4:    e8 c7 fe ff ff           callq  10b0 <system@plt>    // system
    11e9:    90                       nop
    11ea:    5d                       pop    %rbp
    11eb:    c3                       retq   

00000000000011ec <input>:
    11ec:    f3 0f 1e fa              endbr64
    11f0:    55                       push   %rbp
    11f1:    48 89 e5                 mov    %rsp,%rbp
    11f4:    48 83 ec 10              sub    $0x10,%rsp
    11f8:    64 48 8b 04 25 28 00     mov    %fs:0x28,%rax
    11ff:    00 00
    1201:    48 89 45 f8              mov    %rax,-0x8(%rbp)
    1205:    31 c0                    xor    %eax,%eax
    1207:    48 8d 45 f0              lea    -0x10(%rbp),%rax     // rax=(rbp-0x10)'s address
    120b:    48 89 c6                 mov    %rax,%rsi            
    120e:    48 8d 3d 1b 0e 00 00     lea    0xe1b(%rip),%rdi        # 2030 <_IO_stdin_used+0x30>
    1215:    b8 00 00 00 00           mov    $0x0,%eax
    121a:    e8 a1 fe ff ff           callq  10c0 <printf@plt>    // printf
    121f:    48 8d 45 f0              lea    -0x10(%rbp),%rax     // rax=(rbp-0x10)'s address
    1223:    48 83 c0 10              add    $0x10,%rax           // rax=(rbp-0x10)'s address+0x10, [0, 8, 16]
    1227:    48 8b 00                 mov    (%rax),%rax          // rax=*((&p)+2)
    122a:    48 89 c6                 mov    %rax,%rsi
    122d:    48 8d 3d 1c 0e 00 00     lea    0xe1c(%rip),%rdi        # 2050 <_IO_stdin_used+0x50>
    1234:    b8 00 00 00 00           mov    $0x0,%eax
    1239:    e8 82 fe ff ff           callq  10c0 <printf@plt>    // printf
    123e:    48 8d 45 f0              lea    -0x10(%rbp),%rax     // rax=(rbp-0x10)'s address
    1242:    48 83 c0 10              add    $0x10,%rax           // rax=(rbp-0x10)'s address+0x10, [0, 8, 16]
    1246:    48 8d 15 7c ff ff ff     lea    -0x84(%rip),%rdx        # 11c9 <breakout>    // breakout's address
    124d:    48 89 10                 mov    %rdx,(%rax)          // *((&p)+2) = breakout;
    1250:    90                       nop
    1251:    48 8b 45 f8              mov    -0x8(%rbp),%rax
    1255:    64 48 33 04 25 28 00     xor    %fs:0x28,%rax
    125c:    00 00
    125e:    74 05                    je     1265 <input+0x79>
    1260:    e8 3b fe ff ff           callq  10a0 <__stack_chk_fail@plt>
    1265:    c9                       leaveq
    1266:    c3                       retq   

0000000000001267 <main>:
    1267:    f3 0f 1e fa              endbr64
    126b:    55                       push   %rbp
    126c:    48 89 e5                 mov    %rsp,%rbp
    126f:    48 8d 35 f1 ff ff ff     lea    -0xf(%rip),%rsi        # 1267 <main> // rsi=1267=main
    1276:    48 8d 3d 0c 0e 00 00     lea    0xe0c(%rip),%rdi        # 2089 <_IO_stdin_used+0x89>
    127d:    b8 00 00 00 00           mov    $0x0,%eax
    1282:    e8 39 fe ff ff           callq  10c0 <printf@plt>    // printf
    1287:    b8 00 00 00 00           mov    $0x0,%eax
    128c:    e8 5b ff ff ff           callq  11ec <input>         // input
    1291:    48 8d 3d 0b 0e 00 00     lea    0xe0b(%rip),%rdi        # 20a3 <_IO_stdin_used+0xa3>
    1298:    e8 f3 fd ff ff           callq  1090 <puts@plt>      // puts
    129d:    bf 01 00 00 00           mov    $0x1,%edi
    12a2:    e8 29 fe ff ff           callq  10d0 <sleep@plt>     // sleep(1)
    12a7:    eb e8                    jmp    1291 <main+0x2a>     // while(1)
    12a9:    0f 1f 80 00 00 00 00     nopl   0x0(%rax)

/*
 * arm
 */

000000000040064c <breakout>:
  40064c:    a9bf7bfd     stp    x29, x30, [sp, #-16]!
  400650:    910003fd     mov    x29, sp
  400654:    90000000     adrp    x0, 400000 <_init-0x4a0>
  400658:    911ec000     add    x0, x0, #0x7b0
  40065c:    97ffffb5     bl    400530 <puts@plt>               // puts
  400660:    90000000     adrp    x0, 400000 <_init-0x4a0>
  400664:    911f4000     add    x0, x0, #0x7d0
  400668:    97ffffa6     bl    400500 <system@plt>             // system
  40066c:    d503201f     nop
  400670:    a8c17bfd     ldp    x29, x30, [sp], #16
  400674:    d65f03c0     ret

0000000000400678 <input>:
  400678:    a9be7bfd     stp    x29, x30, [sp, #-32]!
  40067c:    910003fd     mov    x29, sp
  400680:    910063a1     add    x1, x29, #0x18
  400684:    90000000     adrp    x0, 400000 <_init-0x4a0>
  400688:    911f6000     add    x0, x0, #0x7d8
  40068c:    97ffffad     bl    400540 <printf@plt>     // printf(0x4007d8, x29+0x18)
  400690:    910063a0     add    x0, x29, #0x18
  400694:    91004000     add    x0, x0, #0x10           // x0=0x29+0x18+0x10
  400698:    f9400001     ldr    x1, [x0]
  40069c:    90000000     adrp    x0, 400000 <_init-0x4a0>    
  4006a0:    911fe000     add    x0, x0, #0x7f8
  4006a4:    97ffffa7     bl    400540 <printf@plt>     // printf
  4006a8:    910063a0     add    x0, x29, #0x18
  4006ac:    91004000     add    x0, x0, #0x10           // x0=0x29+0x18+0x10
  4006b0:    90000001     adrp    x1, 400000 <_init-0x4a0>
  4006b4:    91193021     add    x1, x1, #0x64c          // x1 = 40064c = breakout
  4006b8:    f9000001     str    x1, [x0]                // *((&p)+2) = breakout;
  4006bc:    d503201f     nop
  4006c0:    a8c27bfd     ldp    x29, x30, [sp], #32
  4006c4:    d65f03c0     ret

00000000004006c8 <main>:
  4006c8:    a9bf7bfd     stp    x29, x30, [sp, #-16]!
  4006cc:    910003fd     mov    x29, sp
  4006d0:    90000000     adrp    x0, 400000 <_init-0x4a0>
  4006d4:    911b2001     add    x1, x0, #0x6c8                  // x1=4006c8=main
  4006d8:    90000000     adrp    x0, 400000 <_init-0x4a0>
  4006dc:    9120e000     add    x0, x0, #0x838
  4006e0:    97ffff98     bl    400540 <printf@plt>             // printf
  4006e4:    97ffffe5     bl    400678 <input>                  // input
  4006e8:    90000000     adrp    x0, 400000 <_init-0x4a0>
  4006ec:    91216000     add    x0, x0, #0x858
  4006f0:    97ffff90     bl    400530 <puts@plt>               // puts
  4006f4:    52800020     mov    w0, #0x1                       // #1
  4006f8:    97ffff7e     bl    4004f0 <sleep@plt>          // sleep(1)
  4006fc:    17fffffb     b    4006e8 <main+0x20>          // while(1)


#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1004636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

argparse--命令行参数解析库

文章目录 位置参数help ->描述信息type -> 被转换的类型 可选参数action ->动作基本类型 (store_true)短选项 结合位置参数和可选参数choiceaction ->动作基本类型 (count)default -> 默认值 argparse模块使编写用户友好的命令行变得容易 接口。程序定义了它需要…

6.网络编程套接字(下)

文章目录 4.TCP流套接字编程4.1ServerSocket API4.2Socket API4.3TCP中的长短连接4.4示例一&#xff1a;一发一收&#xff08;长连接&#xff09;4.4.1TCP服务端4.4.2TCP客户端 4.5示例二&#xff1a;请求响应&#xff08;短连接&#xff09;4.5.1TCP服务端4.5.2TCP客户端 4.6再…

32 WEB漏洞-文件操作之文件下载读取全解

目录 介绍利用获取数据库配置文件文件名&#xff0c;参数值&#xff0c;目录符号 涉及案例:Pikachu-文件下载测试-参数Zdns-文件下载真实测试-功能点小米路由器-文件读取真实测试-漏洞RoarCTF2019-文件读取真题复现-比赛百度杯2017二月-Zone真题复现-比赛拓展 下载和读取都差不…

开源大模型ChatGLM2-6B 1. 租一台GPU服务器测试下

0. 环境 租用了1台GPU服务器&#xff0c;系统 ubuntu20&#xff0c;GeForce RTX 3090 24G。过程略。本人测试了ai-galaxy的&#xff0c;今天发现网友也有推荐autodl的。 &#xff08;GPU服务器已经关闭&#xff0c;因此这些信息已经失效&#xff09; SSH地址&#xff1a;* 端…

循环购模式:一种新型的电商模式,让你的生意更轻松

你是否想过&#xff0c;你的商品能够以一种更高效、更环保、更有趣的方式销售给顾客&#xff1f;你是否想过&#xff0c;你的顾客能够以一种更低成本、更高回报、更多互动的方式享受你的商品&#xff1f;如果你的答案是肯定的&#xff0c;那么你一定要了解一下循环购模式。 循环…

TestFlight填写测试信息Beta版App审核信息报错确保联系人电话号码只包含数字,然后重试。

在TestFlight填写测试信息时 Beta版App审核信息报错确保联系人电话号码只包含数字&#xff0c;然后重试。 看到这个报错一脸懵逼&#xff0c;我明明电话号码填写就是纯数字啊。更换了浏览器也是无效&#xff0c;后面发现这个错误提示描述有问题&#xff0c;并不是要求只包含数字…

R语言并行计算提高速度丨parallel包和foreach包

并行计算提高R语言速度 今天与大家分享的是R语言中的并行计算的内容&#xff0c;将探讨如何使用parallel和foreach包在R中进行并行计算&#xff0c;以及在不同情况下提高计算效率的方法。 目标&#xff1a;让计算等待时间缩短&#xff01; 1. 什么是并行计算&#xff1f; 并行计…

认识网线上的各种参数标号

最近工作需要&#xff0c;接触了很多不同类型的网线&#xff0c;为了能够区分不同型号的网线&#xff0c;特意做一篇笔记用来学习&#xff0c;如有记录有误之处&#xff0c;欢迎大家指正~初步认识网线 常用的网络电缆有三种&#xff1a;双绞线、同轴电缆和光纤电缆&#xff08…

Vue3、Vite使用 html2canvas 把Html生成canvas转成图片并保存,以及填坑记录

这两天接到新需求就是生成海报分享&#xff0c;生成的格式虽然是一样的但是自己一点点画显然是不符合我摸鱼人的性格&#xff0c;就找到了html2canvas插件&#xff0c;开始动工。 安装 npm install html2canvas --save文档 options 的参数都在里面按照自己需求使用 https://a…

Python3.10 IDLE更换主题

前言 自定义主题网上有很多&#xff0c;3.10IDLE的UI有一些新的东西&#xff0c;直接扣过来会有些地方覆盖不到&#xff0c;需要自己测试着添几行配置&#xff0c;以下做个记录。 配置文件路径 Python安装目录下的Lib\idlelib\config-highlight.def。如果是默认安装&#xf…

2023年7月京东平板电脑行业品牌销售排行榜(京东销售数据分析)

鲸参谋监测的京东平台7月份平板电脑市场销售数据已出炉&#xff01; 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年7月份&#xff0c;京东平台上平板电脑的销量为68万&#xff0c;同比增长超过37%&#xff1b;销售额为22亿&#xff0c;同比增长约54%。从价格上看…

win11本地连接没了怎么办

很多用户在使用win11系统时发现自己的网络连接没有了&#xff0c;遇到这种情况的话&#xff0c;我们应该怎么处理呢&#xff1f;我们可以尝试打开网络图标&#xff0c;下面就是小编整理出的教程&#xff0c;大家一起看看吧。 win11本地连接没了怎么办 方法一&#xff1a; 1、…

Python基于Flask的招聘信息爬取,招聘岗位分析、招聘可视化系统

Python基于Flask招聘信息可视化系统 一、介绍 今天为大家带来的是Python基于Flask的招聘信息爬取&#xff0c;招聘岗位分析、招聘可视化系统。视频演示地址&#xff1a;https://www.bilibili.com/video/BV1Tp4y1A7nW/ Python基于flask的招聘数据可视化&#xff0c;招聘岗位分…

Cpp/Qtday050912cpp基础

目录 实现一个图形类&#xff08;Shape&#xff09;&#xff0c;包含受保护成员属性&#xff1a;周长、面积&#xff0c; 公共成员函数&#xff1a;特殊成员函数书写 定义一个圆形类&#xff08;Circle&#xff09;&#xff0c;继承自图形类&#xff0c;包含私有属性&#x…

YoloV8改进策略:Diverse Branch Block改进YoloV8,继续在重参数结构上恐龙抗狼

摘要 DBB(Diverse Branch Block)是一种类似Inception的多分支结构,用于网络结构重参数化。它通过多分支结构类型更丰富(多尺度卷积、平均池化等),感受野更多样性,各操作具有不同的计算复杂度,因此更具有通用性,可以用来替换单个卷积进行训练。在训练阶段,对模型中的…

软件自动化测试有哪些步骤?自动化测试需要找第三方检测机构吗?

您是否曾经因为软件出现问题而影响了工作进程或者个人生活的正常运转?那么&#xff0c;您是否了解软件自动化测试这一神奇的技术?在这篇文章中&#xff0c;我们将为您介绍软件自动化测试的定义和测试步骤&#xff0c;帮助您更好地了解自动化测试。 一、什么是软件自动化测试…

Qt自定义QSlider(支持水平垂直)

实现背景&#xff1a; Qt本身有自己的QSlider&#xff0c;为什么我们还要自定义实现呢&#xff0c;因为Qt自带的QSlider存在一个问题&#xff0c;当首尾为圆角时&#xff0c;滑动滚动条到首尾时会出现圆角变成矩形的问题。当然如果QSS之间的margin和滑动条的圆角控制的好的话是…

ModStartBlog v8.2.0 独立友情链接页面,博客列表样式优化

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装 …

【系统设计系列】异步和网络通信

系统设计系列初衷 System Design Primer&#xff1a; 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版&#xff1a; https://github.com/donnemarti…

【DevOps核心理念基础】2. 敏捷开发与DevOps关系

一、什么是敏捷开发 ? 1.1 敏捷开发的核心模型 二、敏捷开发的要点 2.1 敏捷开发 > 执行细节 2.2 敏捷开发 > 思路的转变 客户需求&#xff1a;提升出行速度 三、敏捷开发 与 DevOps 四、DevOps 实践的度量标准 4.1 怎样判断DevOps实践好与坏? 一、什么是敏捷…